BeginInvoke和EndInvoke 执行委托异步方法
namespace InvokeTest
{delegate long MyDel(int first, int second);
class Program
{
static long Sum(int x, int y)
{
Console.WriteLine("当前线程Sum=" + Thread.CurrentThread.ManagedThreadId.ToString());
Console.WriteLine("Inside Sum");
Thread.Sleep(100);
return x + y;
}
static void Main(string[] args)
{
Console.WriteLine("当前线程Main=" + Thread.CurrentThread.ManagedThreadId.ToString());
#region 等待一直到结束模式
//
// MyDel myDel = new MyDel(Sum);
// Console.WriteLine("Before BeginInvoke");
// IAsyncResult iar = myDel.BeginInvoke(3,5,null,null);//开始异步调用
// Console.WriteLine("Doing stuff");
// long result = myDel.EndInvoke(iar);
// Console.WriteLine("After EndInvoke:{0}",result);
#endregion
#region 轮询模式
//MyDel del = new MyDel(Sum);
//IAsyncResult iar = del.BeginInvoke(3, 5, null, null);
//Console.WriteLine("After BeginInvoke");
//while (!iar.IsCompleted)
//{
// Console.WriteLine("Not Done");
// for (long i = 0; i < 10000000; i++)
// ;//空语句
//}
//Console.WriteLine("Done");
//long result = del.EndInvoke(iar);
//Console.WriteLine("Result:{0}", result);
#endregion
#region 回调模式
MyDel del = new MyDel(Sum);
del.BeginInvoke(3, 5, new AsyncCallback(CallWhenDone), null);
Console.WriteLine("Doing more work in Main.");
Thread.Sleep(500);
Console.WriteLine("Done with Main. Exiting.");
#endregion
Console.ReadKey();
}
private static void CallWhenDone(IAsyncResult iar)
{
Console.WriteLine("Inside CallWhereDone.");
AsyncResult ar = (AsyncResult)iar;
MyDel del = (MyDel)ar.AsyncDelegate;
long result = del.EndInvoke(iar);
Console.WriteLine("The result is:{0}.", result);
}
}
}