我们已经知道 C#当中 存在async/await 、BackGroudWorker类以及TPL(任务并行库)。当然C#还有一些旧的模式来支持异步编程。
1. BeginInovke和EndInvoke简单介绍
delegate long MyDel(int first, int second); class Program { static long Sum(int x, int y) { Console.WriteLine("------Inside Sum@{0}", DateTime.Now.ToString()); Thread.Sleep(2000); return x + y; } static void Main(string[] args) { MyDel del = new MyDel(Sum); Console.WriteLine("Before BeginInvoke---@{0}", DateTime.Now.ToString()); IAsyncResult iar = del.BeginInvoke(3, 5, null, null); Console.WriteLine("After BeginInvoke@{0}", DateTime.Now.ToString()); Console.WriteLine("Doing stuff@{0}", DateTime.Now.ToString()); long result = del.EndInvoke(iar); Console.WriteLine("End Invoke@{0}", DateTime.Now.ToString()); Console.WriteLine("After EndInvoke: {0}", result); Console.ReadKey(); } }
如上代码,定义了一个委托 MyDel ,并且在调用的时候把Sum方法传给了它的对象。一般情况下我们调用这个委托对象,它就会调用他调用列表中包含的方法。就想调用方法一样,这是同步完成的。
但是如果委托对象在调用列表中只有一个方法(引用方法),它就可以异步的去执行这个方法。BeginInovke和EndInvoke就是用来做这个事的。我们可以用如下的方式使用:
- ①当我们调用BeginInvoke方法的时候,他开始在一个独立的线程上执行引用方法,并且立即返回到原始线程。原始线程可以继续,而引用方法会在想吃的线程中并行执行。
- ②当程序希望获取已完成的异步方法的结果时,可以检查BeginInvoke返回的IAsyncResult的IsCompleted属性,或者调用委托的EndInvoke方法来等待委托执行完成。