异步委托,恰似一江春水向东流(你了解的异步委托)
书是书,你是你,照抄文字那是书本的东西,你必须有你自己理解,就算是 有错误的认识。下面说下异步委托,个人涉 .net不深,经验尚浅,如果说的不对,希望大家指出来。
??? 对于线程,我不想多说了,可以搜索博客园 风尘浪子的? "线程上与线程下",说的相当详细。本篇博文就是针对:了解一些线程但对异步委托又模糊的朋友。
其实这个异步委托,应该结合 线程Thread来一起讨论的,为什么我们现在对这个异步委托爱不释手,是因为它的3个原因:
.不影响主线程的执行
.合理的利用ThreadPool线程池的线程
.异步委托本质是调用了线程池的工作者线程,不需要为了新建和注销线程烦恼,统一由线程池管理。
1.传统的同步委托(模拟委托的方法执行时间很长)
模拟委托的方法执行很长: Thread.Sleep(TimeSpan.FromSeconds(3));
//声明委托 public delegate string DeleMethod(string name); class Program { static void Main(string[] args) { DeleMethod delemethod = Speaking; //声明回调函数 AsyncCallback callback = new AsyncCallback(CallBack); //执行异步委托 delemethod.BeginInvoke("Mr.w",callback,null); Console.WriteLine("当前线程ID:" + Thread.CurrentThread.ManagedThreadId.ToString()); //主线程方法 Console.WriteLine("下面我还要执行方法...."); //阻止主线程退出程序 Console.ReadKey(); } //回调方法 static void CallBack(IAsyncResult ar) { Console.WriteLine("当前线程ID:" + Thread.CurrentThread.ManagedThreadId.ToString()); AsyncResult result = (AsyncResult)ar; DeleMethod delemethod = (DeleMethod)result.AsyncDelegate;//通过AsyncResult的AsyncDelegate获得delemethod委托对象 string s = delemethod.EndInvoke(ar); Console.WriteLine(s); Console.WriteLine("当前线程ID:"+Thread.CurrentThread.ManagedThreadId.ToString()); } //要被委托调用的方法 static string Speaking(string name) { //利用休眠3秒钟,模拟委托执行的方法很长 Thread.Sleep(TimeSpan.FromSeconds(3)); Console.WriteLine("当前线程ID:" + Thread.CurrentThread.ManagedThreadId.ToString()); Console.WriteLine("我的名字是:{0}", name); return "委托方法执行完毕!"; } }
输出:当前线程ID:1下面我还要执行方法....当前线程ID:3我的名字是:Mr.w当前线程ID:3委托方法执行完毕!当前线程ID:3