委托.BeginInvoke和在C#中使用ThreadPool线程之间的区别

在C#中,使用委托异步地执行某些工作(调用BeginInvoke())和使用ThreadPool线程之间有任何区别,如下所示

public void asynchronousWork(object num) { //asynchronous work to be done Console.WriteLine(num); } public void test() { Action 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确保线程池中的线程用于执行异步代码,所以有什么区别吗?

Joe Duffy,在他的Concurrent Programming on Windows一书(第418页)中,这是关于Delegate.BeginInvoke

按照惯例,所有委托类型都提供BeginInvoke和EndInvoke方法以及普通的同步Invoke方法。 虽然这是一个很好的编程模型function,但您应该尽可能远离它们。 该实现使用远程处理基础结构,这对异步调用施加了相当大的开销。 直接对线程池进行队列工作通常是一种更好的方法,但这意味着您必须自己协调集合点逻辑。

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

 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。