原文很长,此文只提炼出要点
有两种方式,1)异步获取结果通知;2)阻塞式的等待结果
首先定义如下代理,并绑定函数Add
public delegate int DelBinaryOp(int x, int y);
public int Add(int a, int b)
{
Console.WriteLine("running on thread {0}", Thread.CurrentThread.ManagedThreadId);
Thread.Sleep(500);
return (a + b);
}
DelBinaryOp delBp = new DelBinaryOp(Add);
1)异步获取结果通知——IAsyncResult+AsyncCallBack+EndInvoke
delBp.BeginInvoke(5, 5, new AsyncCallback(AddCompleted), null);
在执行Add的线程中,当Add执行完毕后即会回调AddCompleted,此时Add已执行完毕,EndInvoke会立即返回结果
这个获取结果的过程,对于调用delBp的线程来说是异步的
public void AddCompleted(IAsyncResult iar)
{
Console.WriteLine("AddComplete running on thread {0}", Thread.CurrentThread.ManagedThreadId);
//获取绑定函数的引用
AsyncResult ar = (AsyncResult)iar;
DelBinaryOp delBp = (DelBinaryOp)ar.AsyncDelegate;
//等待函数执行完毕
int result = delBp .EndInvoke(iar);
Console.WriteLine("5 + 5 ={0}", result);
}
2)阻塞式的等待结果——IAsyncResult+EndInvoke
IAsyncResult iar = delBp.BeginInvoke(5, 5, null, null);
int result = delBp.EndInvoke(iar); //该方法会阻塞直至delBp执行完