C#线程委托BeginInvoke与EndInvoke的用法

发布时间:2022-08-19 12:01

我们已经知道 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方法来等待委托执行完成。

ItVuer - 免责声明 - 关于我们 - 联系我们

本网站信息来源于互联网,如有侵权请联系:561261067@qq.com

桂ICP备16001015号