我是否应该注意到在.Net 4.0中使用任务与线程的区别?

The*_*ies 18 c# multithreading .net-4.0 task

我更新了我的代码以使用Tasks而不是线程....

看看内存使用情况和CPU我没有注意到多核PC的任何改进,这是预期的吗?

我的应用程序基本上在运行时启动不同对象中的线程/任务...

我所做的一切都很简单

Task a = new Task(...)
a.Start();
Run Code Online (Sandbox Code Playgroud)

Dan*_*ant 29

使用Tasks而不是Threads有各种各样的含义,但性能并不是主要的(假设你没有创建大量的线程.)一些关键的区别:

  1. 默认的TaskScheduler将使用线程池,因此在完成其他待处理任务之前,某些任务可能无法启动.如果直接使用Thread,每次使用都会启动一个新的Thread.
  2. 当任务中发生异常时,它会被包装到AggregateException中,调用代码在等待任务完成时或者在Task上注册延续时可以接收.这是因为您还可以执行等待多个任务完成的操作,在这种情况下,可以抛出并聚合多个异常.
  3. 如果你没有观察到一个Task抛出的未处理的异常,那么它(最终可能)最终会被Task的终结器抛出,这是特别令人讨厌的.我总是建议挂钩TaskScheduler.UnobservedTaskException事件,这样你至少可以在应用程序爆炸之前记录这些失败.这与线程异常不同,后者出现在AppDomain.UnhandledException事件中.


Jar*_*Par 8

如果您只是简单地替换了Threadwith的每个用法Task而没有进行其他更改,我会期望几乎相同的性能.该TaskAPI实际上只是说,这是在现有的组构建的API.在引擎盖下,它使用线程来安排它的活动,因此具有类似的性能特征.

什么是伟大的大约Task是新的东西,你可以与他们无关

  • 作文与 ContinueWith
  • 消除
  • 层次结构
  • 等......

  • TPL摆脱了混淆臃肿的代码.这是每个开发人员最终想写的API,但没有时间这样做. (2认同)