在C#和delegate.BeginInvoke区别使用线程池线程(Difference betwe

2019-06-23 23:57发布

在C#是有使用委托做一些工作以异步方式(调用的BeginInvoke()),并使用线程池线程之间的任何差异,如下所示

public void asynchronousWork(object num)
    {
        //asynchronous work to be done
        Console.WriteLine(num);
    }

 public void test()
    {
        Action<object> myCustomDelegate = this.asynchronousWork;
        int x = 7;

        //Using Delegate
        myCustomDelegate.BeginInvoke(7, null, null);

        //Using Threadpool
        ThreadPool.QueueUserWorkItem(new WaitCallback(asynchronousWork), 7);
        Thread.Sleep(2000);
    }

编辑:
的BeginInvoke可以确保从线程池中的线程来执行异步代码,那么有没有什么区别?

Answer 1:

乔·达菲,他Concurrent Programming on Windows的书(418页)说,这大约Delegate.BeginInvoke

所有委托类型,按照约定提供的BeginInvoke和EndInvoke方法一起普通的同步Invoke方法。 虽然这是一个很好的编程模型的功能,你应该远离他们尽可能。 实现使用这带来相当大的开销,异步调用远程基础设施。 队列工作线程池经常直接是一个更好的办法,虽然这意味着你必须自己统筹交会逻辑。

编辑:我创建了相对开销如下简单的测试:

int counter = 0;
int iterations = 1000000;
Action d = () => { Interlocked.Increment(ref counter); };

var stopwatch = new System.Diagnostics.Stopwatch();
stopwatch.Start();
for (int i = 0; i < iterations; i++)
{
    var asyncResult = d.BeginInvoke(null, null);
}

do { } while(counter < iterations);
stopwatch.Stop();

Console.WriteLine("Took {0}ms", stopwatch.ElapsedMilliseconds);
Console.ReadLine();

在我的机器上面的测试在20秒左右运行。 更换BeginInvoke调用与

System.Threading.ThreadPool.QueueUserWorkItem(state =>
{
    Interlocked.Increment(ref counter);
});

改变了运行时间864ms。



文章来源: Difference between delegate.BeginInvoke and using ThreadPool threads in C#