C#使用异步方式调用同步方法的实现方法
使用异步方式调用同步方法,在此我们使用异步编程模型(APM)实现
1、定义异步委托和测试方法
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; namespace ApmAsyncApp { public delegate string TestMethodAsyncCaller(int callDuration, out int threadId); /// internal class AsyncDemo { /// 执行异步调用的方法 /// /// /// /// public string TestMethod(int callDuration,out int threadId) { Console.WriteLine("Test method begins:"); Thread.Sleep(callDuration); threadId=Thread.CurrentThread.ManagedThreadId; return String.Format("Call time was {0}",callDuration); } } }
2、使用 EndInvoke 等待异步调用
static void Main(string[] args) { int threadId; //创建测试类 AsyncDemo asyncDemo = new AsyncDemo(); //创建委托 TestMethodAsyncCaller caller = new TestMethodAsyncCaller(asyncDemo.TestMethod); //初始化异步调用 IAsyncResult result = caller.BeginInvoke(3000, out threadId, null, null); Thread.Sleep(0); Console.WriteLine("Main thread {0} does some work.", Thread.CurrentThread.ManagedThreadId); //调用EndInvoke检索结果 string returnValue = caller.EndInvoke(out threadId, result); Console.WriteLine("The call executed on thread {0},with return value \"{1}\".", threadId, returnValue); Console.ReadLine(); }
3、使用 WaitHandle 等待异步调用
static void Main(string[] args) { int threadId; //创建测试类 AsyncDemo asyncDemo = new AsyncDemo(); //创建委托 TestMethodAsyncCaller caller = new TestMethodAsyncCaller(asyncDemo.TestMethod); //初始化异步调用 IAsyncResult result = caller.BeginInvoke(3000, out threadId, null, null); Thread.Sleep(0); Console.WriteLine("Main thread {0} does some work.", Thread.CurrentThread.ManagedThreadId); //sone to do //等待信号 result.AsyncWaitHandle.WaitOne(); //调用EndInvoke检索结果 string returnValue = caller.EndInvoke(out threadId, result); result.AsyncWaitHandle.Close(); Console.WriteLine("The call executed on thread {0},with return value \"{1}\".", threadId, returnValue); Console.ReadLine(); }
4、对异步调用的完成情况进行轮询
static void Main(string[] args) { int threadId; //创建测试类 AsyncDemo asyncDemo = new AsyncDemo(); //创建委托 TestMethodAsyncCaller caller = new TestMethodAsyncCaller(asyncDemo.TestMethod); //初始化异步调用 IAsyncResult result = caller.BeginInvoke(3000, out threadId, null, null); Thread.Sleep(0); Console.WriteLine("Main thread {0} does some work.", Thread.CurrentThread.ManagedThreadId); // 等待完成. while (result.IsCompleted == false) { Thread.Sleep(250); Console.Write("."); } //调用EndInvoke检索结果 string returnValue = caller.EndInvoke(out threadId, result); Console.WriteLine("The call executed on thread {0},with return value \"{1}\".", threadId, returnValue); Console.ReadLine(); }
5、异步调用完成时执行回调方法
static void Main(string[] args) { int threadId = 0; //创建测试类 AsyncDemo asyncDemo = new AsyncDemo(); //创建委托 TestMethodAsyncCaller caller = new TestMethodAsyncCaller(asyncDemo.TestMethod); //初始化异步调用 IAsyncResult result = caller.BeginInvoke(3000, out threadId, new AsyncCallback(callbackMethod), "The call executed on thread {0},with return value \"{1}\"."); Console.WriteLine("Main thread {0} does some work.", Thread.CurrentThread.ManagedThreadId); Thread.Sleep(5000); Console.WriteLine("The main thread ends."); Console.ReadLine(); } private static void callbackMethod(IAsyncResult ar) { //检索委托. AsyncResult result = (AsyncResult)ar; TestMethodAsyncCaller caller = (TestMethodAsyncCaller)result.AsyncDelegate; //格式字符串作为状态信息被传递 string formatString = (string)ar.AsyncState; int threadId = 0; //调用EndInvoke检查结果. string returnValue = caller.EndInvoke(out threadId, ar); //用格式字符串格式化输出信息 Console.WriteLine(formatString, threadId, returnValue); }
文章版权声明:除非注明,否则均为主机测评原创文章,转载或复制请以超链接形式并注明出处。