BeginInvoke、ThreadPool、Task三类异步方法的区别和速度比较
2012-07-25 11:24
483 查看
速度(最快为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 | 支持 |
用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
相关文章推荐
- BeginInvoke、ThreadPool、Task三类异步方法的区别和速度比较
- BeginInvoke、ThreadPool、Task三类异步方法的区别和速度比较
- Windows Phone 多线程-Thread与BeginInvoke的区别-多种多线程编程比较
- 普通方法调用,Invoke,begininvoke三者的区别总结及异步与同步的区别总结
- ThreadPoolTaskExecutor异步的处理报警发送邮件短信比较耗时的东东
- C# 使用 Task 替换 ThreadPool ,异步监测所有线程(任务)是否全部执行完毕
- ThreadPoolTaskExecutor 多线程分解执行耗时任务与单线程串行执行简单比较
- [推荐]c# Invoke和BeginInvoke 区别 很详细的比较
- .NET 异步多线程,Thread,ThreadPool,Task,Parallel
- 使用 Task 替换 ThreadPool ,异步监测所有线程(任务)是否全部执行完毕
- C# 多线程 用委托实现异步_调用委托的BeginInvoke和EndInvoke方法
- 19、构建多线程应用程序:委托异步调用方法(BeginInvoke,EndInvoke,AsyncCallback)
- C# delegate方法invoke和beginInvoke的区别
- Thread,ThreadPool,Task, 到async await 的基本使用方法和理解
- NET 异步多线程,THREAD,THREADPOOL,TASK,PARALLEL
- ThreadPoolTaskExecutor提高服务器响应速度
- WinForm 之Control.Invoke 和Control.BeginInvoke 方法的使用 Control 不能在创建它的 Thread 之外被调用。但可以通过 invoke 来保证 C
- 创建线程的方法【CreateThread, AfxBeginThread,_beginthread, _beginthreadex的区别】
- ThreadPoolTaskExecutor 多线程分解执行耗时任务与单线程串行执行简单比较
- 从Thread,ThreadPool,Task, 到async await 的基本使用方法解读