委托和方法的异步调用
通过委托变量的BeginInvoke方法,可以从线程池中抓出一个线程异步执行委托方法。
//public delegate T2 AddDelegate(T x, T y);
// BeginInvoke()除了最后两个参数为AsyncCallback类型和Object类型以外,前面的参数类型和个数与委托定义相同
// 调用BeginInvoke()之后,需要保留IAsyncResult,以便在调用EndInvoke()时进行传递
IAsyncResult asyncResult = addDelegateWord.BeginInvoke(T t0, T t1, null, null );
// 用IAsyncResult分辨委托的调用,EndInvoke返回委托的返回值,
// 尽早使用BeginInvoke,在合适的时候使用EndInvoke(EndInvoke会等待线程池中的执行结果)
T2 outResult = addDelegateWord.EndInvoke(asyncResult);
如果需要在另一段代码获得返回值,可以通过AsyncResult获得委托对象addDelegateWord,再由addDelegateWord.EndInvoke获得返回结果。
AsyncResult的用途有这么几个:
- 传递参数,它包含了对调用了BeginInvoke()的委托的引用;
- 包含了BeginInvoke()的最后一个Object类型的参数;
- 鉴别出是哪个方法的哪一次调用,因为通过同一个委托变量可以对同一个方法调用多次。
static T2 ONGetReturn(IAsyncResult asyncResult)
{
// 先由IAsyncResult接口获得AsyncResult实例,因为只有AsyncResult才包含委托对象的引用
AsyncResult result = (AsyncResult)asyncResult;
// 由AsyncDelegate属性获得委托对象
AddDelegate addDelegateWord = (AddDelegate)result.AsyncDelegate;
// Return委托对象的返回值
T2 res = addDelegateWord.EndInvoke