使用异步方式调用同步方法,在此我们使用异步编程模型(APM)实现
1、定义异步委托和测试方法
csharp
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);
/// <summary>
internal class AsyncDemo
{
/// 执行异步调用的方法
/// </summary>
/// <param name="callDuration"></param>
/// <param name="threadId"></param>
/// <returns></returns>
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 等待异步调用
csharp
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 等待异步调用
csharp
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、对异步调用的完成情况进行轮询
csharp
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、异步调用完成时执行回调方法
csharp
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);
}