速度(最快為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的時機。