1. 什么是异步委托
1)异步委托是采用异步回调的方式实现异步执行,当使用委托异步执行某个方法时,将从线程池中取出一个线程去执行该方法。
2)当执行完成后则调用 AsyncCallback 委托指定的方法,完成异步回调。
class Program
{
static void Main(string[] args)
{
//获取主线程ID
Console.WriteLine("主线程id:" + Thread.CurrentThread.ManagedThreadId);
Func<int, int, string> func = (a, b) => { Console.WriteLine("Delegate线程ID:" + Thread.CurrentThread.ManagedThreadId); Thread.Sleep(2000); return (a + b).ToString(); };
//异步执行委托
#region 异步委托简单方式
//IAsyncResult result = func.BeginInvoke(5, 5, null, null);
//string s = func.EndInvoke(result);
//Console.WriteLine(result.IsCompleted);//true
//Console.WriteLine(s);
//Console.WriteLine("成功被EndInvoke函数阻挡");
#endregion
#region 有回调函数的异步委托
//AsyncCallback
IAsyncResult result = func.BeginInvoke(5, 5, MyAsyncCallback, func);//最后一个参数直接把委托传过来
#endregion
Console.ReadKey();
}
public static void MyAsyncCallback(IAsyncResult ar)
{ //由执行异步委托的线程执行,不会阻塞主线程
//拿到异步执行的结果
//获取对异步结果封装的类
//AsyncResult result = (AsyncResult)ar;
//Func<int,int,string> funcs=(Func<int,int,string>)result.AsyncDelegate;
//string str=funcs.EndInvoke(result);
//获取传过来啊的委托对象
Func<int, int, string> funcs = (Func<int, int, string>)ar.AsyncState;//ar.AsyncState;拿到传过来的最后一个参数相关数据
string str = funcs.EndInvoke(ar);
Console.WriteLine(str);
}
}
异步委托可以获取线程返回值,而单开线程执行方法无法获取其返回值,是与线程的不同点
总结:
- 异步委托主要是使用BeginInvoke()方法开启异步委托,该方法传入一个回调委托AsyncCallBack对象
- BeginInvoke()返回一个实现了IasynResult接口的对象,可以使用该对象的 AsyncWaitHandle.WaitOne() 方法和 IsCompleted 属性判断异步是否完成。
- 需要获取异步委托的返回结果,都必须调用 EndInvoke() 方法。
- AsyncState :获取用户定义的对象,它限定或包含关于异步操作的信息(BeginInvoke函数最后的传入参数)。