//闲来无事,巩固同步异步方面的知识,以备后用,特整理如下:
class Program { static void Main(string[] args) { //同步调用 会阻塞当前线程,一步一步进行调用 Console.WriteLine("============同步调用线程:" + Thread.CurrentThread.ManagedThreadId+"============"); AddHandler _handler01 = AddMethod.Add; int _result01 = _handler01(1, 2); Console.WriteLine("继续做别的事情。。。"); Console.WriteLine("同步调用结果:"+_result01); Console.WriteLine(); //异步调用 不会阻塞当前线程,会放到线程池里 //异步调用通过BeginInvoke和EndInvoke来实现(成对应用)。 Console.WriteLine("============异步调用线程:" + Thread.CurrentThread.ManagedThreadId + "============"); AddHandler _handler02 = AddMethod.Add; IAsyncResult _result02 = _handler02.BeginInvoke(3, 8, null, null); Console.WriteLine("继续做别的事情。。。"); Console.WriteLine("异步调用结果:"+_handler02.EndInvoke(_result02)); Console.WriteLine(); //用回调函数,当调用结束时会自动调用回调函数,解决了为等待调用结果,而让线程依旧被阻塞的局面。 [email protected] Console.WriteLine("============异步回调 线程:" + Thread.CurrentThread.ManagedThreadId + "============"); AddHandler _handler03 = AddMethod.Add; IAsyncResult _result03 = null; _result03 = _handler03.BeginInvoke(9, 8, (IAsyncResult _ia) => { Console.WriteLine("异步回调结果:"+_handler03.EndInvoke(_result03)); }, null); Console.WriteLine("继续做别的事情。。。"); Console.ReadKey(); } } public delegate int AddHandler(int _a,int _b); public class AddMethod { public static int Add(int _a, int _b) { Console.WriteLine("开始计算:" + _a + "+" + _b); Thread.Sleep(3000); Console.WriteLine("计算完成! 线程:"+Thread.CurrentThread.ManagedThreadId); return _a + _b; } } }
//运行结果,如图:
整理自:http://blog.csdn.net/wanlong360599336/article/details/8781477
- 1楼CodingNinja
- 我测试的和你不一样,发现第二、三种方式没区别!!!,
- Re: 眯眼看世界
- @CodingNinja,结果是一样,但是2.3种方法区别在于3比2多了回调的应用,3在异步开启时就定义好了方法,2异步开启后定义的方法。