Ste*_*ano 22 .net asynchronous
我不是一个主题专家,我试图更多地了解.NET中可用的异步世界.Task.Run和ThreadPool.QueueUserWorkItem都允许在池线程上调度工作,但有什么区别,或者,如果您愿意,两者的优缺点是什么?以下是我的专业人士名单.不确定它是完整的还是正确的.
ThreadPool.QueueUserWorkItem专业人士:
Task.Run专业人士:
Sco*_*ain 25
ThreadPool.QueueUserWorkItem只是在.NET 1.1中引入相同工作的旧实现(在.NET 1.1中Task.Run引入).
Microsoft试图避免破坏.NET中的向后兼容性.为.NET 1.1编写的东西可以在.NET 4.5中编译和运行,通常没有任何更改.中断更改通常来自编译器更改,而不是框架更改,例如在foreachlambda中使用的变量在C#5和更新版本中表现不同.
还有就是用没有真正的理由ThreadPool.QueueUserWorkItem,当你有Task.Run.
一个终点:具有讽刺意味的是,事情实际上已经完全循环了HostingEnvironment.QueueBackgroundWorkItem(...).它允许您在ASP.NET环境中的后台线程上运行某些东西,并让后台工作通知AppDomainWeb服务器关闭(在长时间不活动时经常会发生这种情况).
我ThreadPool.QueueUserWorkItem和Task.Run我最近意识到的一个区别是它们处理异常的方式。
如果ThreadPool.QueueUserWorkItem未处理的异常发生在内部并且未被全局异常处理程序处理,它将使父线程崩溃。另一方面,Task.Run线程的未处理异常不会传播,直到您await或Task.Wait。