public delegate int mydelegate(int x, int y);
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Main中正在执行的线程ID:{0}",Thread.CurrentThread.ManagedThreadId);
///实例化一个委托
mydelegate d = new mydelegate(Add);
//委托的同步调用
//int resuit = d.Invoke(2, 4);
//Console.WriteLine("2+4 is={0}",resuit);
///委托的异步调用
///生成BeginInvoke的方法是 public IAsyncResult BeginInvoke(int x,int y,AsyncCallBack cb,Object state)
///生成EndInvoke的方法是 public int EndInvoke(IAsyncResult result)
///BeginInvoke和EndInvoke是一种耦合机制,EndInvoke需要一个IAsyncResult类型参数,BeginInvoke返回的是IAsyncResult
//IAsyncResult IResuit = d.BeginInvoke(2, 3, null, null);
//int AsyncResuit = d.EndInvoke(IResuit);
//Console.WriteLine("2+4 is={0}",AsyncResuit);
///同步调用线程
///
//IAsyncResult IResuit = d.BeginInvoke(2, 4, null, null);
//while (!IResuit.IsCompleted)
//{
// Console.WriteLine("Doing more work in Main()");
// Thread.Sleep(1000);
//}
//int AsyncResuit = d.EndInvoke(IResuit);
//Console.WriteLine("2+4 is={0}", AsyncResuit);
//IAsyncResult IResuit = d.BeginInvoke(2, 4, null, null);
//while (IResuit.AsyncWaitHandle.WaitOne(1000, true))
//{
// Console.WriteLine("Doing more work is Main");
//}
///当BeginInvoke处理完数据后调用AsyncCallback
///通过次线程通知主线程,这样子比主线程频繁询问次线程要好些。
IAsyncResult IResuit = d.BeginInvoke(2, 3, new AsyncCallback(AddComplete), null);
//int AsyncResuit = d.EndInvoke(IResuit);
//Console.WriteLine("2+4 is={0}", AsyncResuit);
Console.ReadKey();
}
static void AddComplete(IAsyncResult resut)
{
Console.WriteLine("addComplete线程ID:{0}",Thread.CurrentThread.ManagedThreadId);
Console.WriteLine("you addition is complete");
/// AsyncResult定义在了System.Runtime.Remoting.Messaging;
/// 该类的mydelegate返回了原始异步委托的应用,这个地方就是
/// public delegate int mydelegate(int x, int y);
/// 这样子写的原因是BeginInvoke处理完了后,会调用AsyncCallback,但是他访问不到定义在Main中的EndInvoke
AsyncResult r = (AsyncResult)resut;
mydelegate b = (mydelegate)r.AsyncDelegate;
Console.WriteLine(b.EndInvoke(resut));
}
static int Add(int x, int y)
{
Console.WriteLine("Add方法中正在执行的线程ID:{0}",Thread.CurrentThread.ManagedThreadId);
//暂停一下,模拟一个耗时的操作
Thread.Sleep(5000);
return x + y;
}
}