我正在阅读并阅读到,如果我在 .Net 中使用任务而不是线程,它们将不会受到线程有问题的上下文切换的影响。
然而,阅读时我也注意到任务只是在幕后使用线程。
所以我有点困惑,任何澄清表示赞赏。
我正在阅读并阅读到,如果我在 .Net 中使用任务而不是线程,它们将不会受到线程有问题的上下文切换的影响。
然而,阅读时我也注意到任务只是在幕后使用线程。
所以我有点困惑,任何澄清表示赞赏。
你读错了。
Task
是 TPL 的一部分。TPL 使用比 CLR 的线程池更高级的调度程序。一个例子是 TPL 调度程序使用WorkStealingQueues
.
几个事实:
Task.Factory.StartNew
,还是ThreadPool.QueueUserWorkItem
两者都将使用相同的线程池 (.NET 4.0)Task
“原始”线程还是“原始”线程,每个时间片都会导致上下文切换。Task
将导致与常规线程一样多的上下文切换。请注意,只有在没有足够的处理器同时处理线程时才会发生上下文切换。
一些要查看的链接:
TPL 和 Threadpool 的区别,以及 .NET 4.0 中的更改线程池: http ://www.danielmoth.com/Blog/New-And-Improved-CLR-4-Thread-Pool-Engine.aspx
展示如何在 C# 中实现 WorkStealingQueue:http: //www.bluebytesoftware.com/blog/2008/08/12/BuildingACustomThreadPoolSeriesPart2AWorkStealingQueue.aspx
daniel moth 博客文章的简短版本:http: //blogs.msdn.com/b/jennifer/archive/2009/06/26/work-stealing-in-net-4-0.aspx
上下文切换不是线程固有的,它们是线程滥用所固有的。任务以这样一种方式使用线程,即任何正在运行的线程都可以执行任何需要完成的任务,从而避免了线程被滥用时发生的代价高昂的上下文切换。