public void Invoke() { Console.WriteLine("主线程{0} 正在执行中....", Thread.CurrentThread.ManagedThreadId); #region 异步委托 AddDel addDemo = AddFun; var ascResult = addDemo.BeginInvoke(1, 2, null, null); while (!ascResult.IsCompleted) { //主线程再干一些事情 } // //此EndInvoke方法会阻塞当前线程。 直到 委托方法执行完毕后,并将返回值交给 result后,继续执行后面的代码 int result = addDemo.EndInvoke(ascResult); //第二种: 使用 回调函数 IAsyncResult ascResult2 = addDemo.BeginInvoke(1, 2, MyDelCallBakc, 3); Console.WriteLine("执行的结果是:{0}", result); Console.ReadKey(); #endregion 异步委托 #region 并行计算 int[] sum = { 0 }; object lck = new object(); Parallel.For(1, 1000000, i => { lock (lck) { sum[0] += i; } Console.WriteLine("当前执行到 :" + i + "@" + Thread.CurrentThread.ManagedThreadId); Thread.Sleep(1000); }); Console.WriteLine(sum[0]); sum[0] = 0; for (int i = 1; i < 1000000; i++) { sum[0] += i; } Console.WriteLine(sum[0] + "---"); #endregion 并行计算 Console.WriteLine("主线程执行完毕。。。"); }
//异步委托执行的顺序是:主线程创建一个委托对象,往下执行发现是异步调用这个委托方法,就开启一个线程来执行这个委托方法,主线程继续在往下执行,这个委托方法执行完成之后在进入到回调函数通过回调函数来获得他的执行结果 private static void callback(IAsyncResult ar) { Console.WriteLine("回调函数被执行了"); Thread.Sleep(1000); Console.WriteLine(Thread.CurrentThread.ManagedThreadId); AsyncResult demo = ar as AsyncResult; AddDel del = (AddDel)demo.AsyncDelegate; //就是当前的异步委托对象 int result = del.EndInvoke(ar); Console.WriteLine(result); Console.WriteLine(demo.AsyncState); }
//异步委托 执行完成了的回调函数 public static void MyDelCallBakc(IAsyncResult result) { //Thread.CurrentThread; //把接口类型转换成实例类型 AsyncResult asyncResult = (AsyncResult)result; //转换成我们自己的委托类型 AddDel del = (AddDel)asyncResult.AsyncDelegate; //执行完成获取 执行的结果 int addResult = del.EndInvoke(result); int state = (int)asyncResult.AsyncState; Console.WriteLine("异步完成的回调方法执行的结果是:{0} @{1}", addResult, Thread.CurrentThread.ManagedThreadId); }