BeginInvoke、ThreadPool、Task三类异步方法的区别和速度比较

 速度(最快为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支持
  1. ThreadPool.UnsafeQueueUserWorkItem(()=>result=Add(1,2));

  2. Task<>

  3. 里面在程序末尾EventWaitHandle.Set(),外面WaitOne(TimeSpan)。

  4. 获得BeginInvoke的返回值asyncResult,再调asyncResult.AsyncWaitHandle.WaitOne();


 

有图有真相。这是各种异步方法循环调用N次所需的时间。

代码如下

 

[csharp]  view plain copy
 
  1. static void Main(string[] args)  
  2.    {  
  3.        Action threadStart = (() => { });  
  4.        WaitCallback waitCallback = new WaitCallback(a => { });  
  5.        Stopwatch stopWatch = new Stopwatch();  
  6.   
  7.        stopWatch.Reset();  
  8.        stopWatch.Start();  
  9.        for (int i = 0; i < 10000; i++)  
  10.        {  
  11.            System.Threading.ThreadPool.UnsafeQueueUserWorkItem(waitCallback, null);  
  12.        }  
  13.        stopWatch.Stop();  
  14.        Console.WriteLine("{0,-40}{1}", "ThreadPool.UnsafeQueueUserWorkItem():", stopWatch.ElapsedTicks);  
  15.        GC.Collect();  
  16.   
  17.        stopWatch.Reset();  
  18.        stopWatch.Start();  
  19.        for (int i = 0; i < 10000; i++)  
  20.        {  
  21.            System.Threading.ThreadPool.QueueUserWorkItem(waitCallback);  
  22.        }  
  23.        stopWatch.Stop();  
  24.        Console.WriteLine("{0,-40}{1}", "ThreadPool.QueueUserWorkItem():", stopWatch.ElapsedTicks);  
  25.        GC.Collect();  
  26.   
  27.        stopWatch.Reset();  
  28.        stopWatch.Start();  
  29.        for (int i = 0; i < 10000; i++)  
  30.        {  
  31.            Task t = new Task(threadStart);  
  32.            t.Start();  
  33.        }  
  34.        stopWatch.Stop();  
  35.        Console.WriteLine("{0,-40}{1}", "Task():", stopWatch.ElapsedTicks);  
  36.        GC.Collect();  
  37.   
  38.        stopWatch.Reset();  
  39.        stopWatch.Start();  
  40.        for (int i = 0; i < 10000; i++)  
  41.        {  
  42.            threadStart.BeginInvoke(null, null);  
  43.        }  
  44.        stopWatch.Stop();  
  45.        Console.WriteLine("{0,-40}{1}", "Delegate.BeinInvoke():", stopWatch.ElapsedTicks);  
  46.   
  47.    }   

 

注意,上面BeginInvoke的用法并不完整,应当再调用EndInvoke。但是鉴于BeginInvoke已经最慢了,EndInvoke便不加了。

所以,如果无需返回值,一般就用ThreadPool吧,要更多控制,就Task。鄙人想不到用BeginInvoke的时机。

 

参考

http://shevaspace.blogspot.com/2007/08/delegatebegininvoke-vs.html

转载于:https://www.cnblogs.com/fuqiang88/p/5076452.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值