5

我正在阅读并阅读到,如果我在 .Net 中使用任务而不是线程,它们将不会受到线程有问题的上下文切换的影响。

然而,阅读时我也注意到任务只是在幕后使用线程。

所以我有点困惑,任何澄清表示赞赏。

4

2 回答 2

11

你读错了。

Task是 TPL 的一部分。TPL 使用比 CLR 的线程池更高级的调度程序。一个例子是 TPL 调度程序使用WorkStealingQueues.

几个事实:

  • 无论您这样做Task.Factory.StartNew,还是ThreadPool.QueueUserWorkItem两者都将使用相同的线程池 (.NET 4.0)
  • 无论您使用Task“原始”线程还是“原始”线程,每个时间片都会导致上下文切换。
  • 此外,如果更高优先级的线程变得可运行,它将导致上下文切换。
  • ATask将导致与常规线程一样多的上下文切换。

请注意,只有在没有足够的处理器同时处理线程时才会发生上下文切换。

一些要查看的链接:

于 2011-12-05T18:28:54.903 回答
1

上下文切换不是线程固有的,它们是线程滥用所固有的。任务以这样一种方式使用线程,即任何正在运行的线程都可以执行任何需要完成的任务,从而避免了线程被滥用时发生的代价高昂的上下文切换。

于 2011-12-04T22:09:17.410 回答