| 速度(最快为1) | 返回值 | 多参数 | 等待在时限内完成 | 超时后结束 | |
| ThreadPool.UnsafeQueueUserWorkItem() | 1 | 非原生支持1 | 非原生支持 | 非原生支持3 | 不支持 |
| ThreadPool.QueueUserWorkItem() | 2.7 | 非原生支持1 | 非原生支持 | 非原生支持3 | 不支持 |
| Task() | 4.5 | 支持2 | 非原生支持 | 支持 | 自愿结束 |
| Delegate.BeinInvoke() | 25.4 | 非原生支持1 | 支持 | 支持4 | 不支持 |
| Thread.Start() | 11009 | 非原生支持1 | 非原生支持 | 非原生支持3 | 支持 |
-
如ThreadPool.UnsafeQueueUserWorkItem(()=>result=Add(1,2));
-
用Task<>
-
里面在程序末尾EventWaitHandle.Set(),外面WaitOne(TimeSpan)。
-
获得BeginInvoke的返回值asyncResult,再调asyncResult.AsyncWaitHandle.WaitOne();
有图有真相。这是各种异步方法循环调用N次所需的时间。

代码如下
static void Main(string[] args)
{
Action threadStart = (() => { });
WaitCallback waitCallback = new WaitCallback(a => { });
Stopwatch stopWatch = new Stopwatch();
stopWatch.Reset();
stopWatch.Start();
for (int i = 0; i < 10000; i++)
{
System.Threading.ThreadPool.UnsafeQueueUserWorkItem(waitCallback, null);
}
stopWatch.Stop();
Console.WriteLine("{0,-40}{1}", "ThreadPool.UnsafeQueueUserWorkItem():", stopWatch.ElapsedTicks);
GC.Collect();
stopWatch.Reset();
stopWatch.Start();
for (int i = 0; i < 10000; i++)
{
System.Threading.ThreadPool.QueueUserWorkItem(waitCallback);
}
stopWatch.Stop();
Console.WriteLine("{0,-40}{1}", "ThreadPool.QueueUserWorkItem():", stopWatch.ElapsedTicks);
GC.Collect();
stopWatch.Reset();
stopWatch.Start();
for (int i = 0; i < 10000; i++)
{
Task t = new Task(threadStart);
t.Start();
}
stopWatch.Stop();
Console.WriteLine("{0,-40}{1}", "Task():", stopWatch.ElapsedTicks);
GC.Collect();
stopWatch.Reset();
stopWatch.Start();
for (int i = 0; i < 10000; i++)
{
threadStart.BeginInvoke(null, null);
}
stopWatch.Stop();
Console.WriteLine("{0,-40}{1}", "Delegate.BeinInvoke():", stopWatch.ElapsedTicks);
}
注意,上面BeginInvoke的用法并不完整,应当再调用EndInvoke。但是鉴于BeginInvoke已经最慢了,EndInvoke便不加了。
所以,如果无需返回值,一般就用ThreadPool吧,要更多控制,就Task。鄙人想不到用BeginInvoke的时机。
参考
http://shevaspace.blogspot.com/2007/08/delegatebegininvoke-vs.html

本文通过实验证明了在不同异步方法循环调用同一任务时,ThreadPool.QueueUserWorkItem、Task、Delegate.BeginInvoke各自的性能表现。实验结果显示,使用ThreadPool.QueueUserWorkItem方法的性能最优,而Delegate.BeginInvoke则最为缓慢。因此,对于不需要返回值且追求高效执行的任务,推荐使用ThreadPool;若需更多控制,则考虑使用Task。

654

被折叠的 条评论
为什么被折叠?



