.net - 使用 System.Threading.Task 将工作项排队到线程池

标签 .net multithreading task-parallel-library threadpool portable-class-library

我想知道哪种(如果有的话)是使用 System.Threading.Task 对象将工作项(委托(delegate))排队到 .Net 4.5 中的线程池的最直接方法。我想做的基本上是用 Task 复制 ThreadPool.QueueUserWorkItem() 方法的排队功能。如果我错了,请纠正我,但据我所知,使用此方法入队的工作项保证按照它们入队的顺序执行(对于多处理器场景,我可能完全错了)。我必须使用 Task 编写行为相同的代码。

我正在开发一个可移植类库,所以这就是为什么我不能使用 ThreadPool.QueueUserWorkItem(),而是我必须依赖 Task 的原因这个目标。你会建议什么技术?默认任务调度程序是否适合此要求?

最佳答案

ThreadPool 不需要按照与安排的顺序完全相同的顺序执行委托(delegate)(至少我没有在文档中找到类似的保证)。但据我所知,这几乎就是它的行为方式。

Task(使用默认的 TaskScheduler)更复杂,因为它们使用线程局部队列,按 LIFO 顺序处理。如果你想确保所有的 Task 都进入全局 FIFO 队列,你可以使用 TaskCreationOptions.PreferFairness .但同样,没有记录它到底做了什么,所以具体情况可能会发生变化。

关于.net - 使用 System.Threading.Task 将工作项排队到线程池,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17588783/

相关文章:

c++ - boost::asio::io_service 事件循环中的事件数

java - 寻找多线程死锁的原因?

c# - 一个 ActionBlock 可以链接到另一个包含更多参数的 ActionBlock 吗?

c# - 使用表示查询的未知数量的嵌套数组反序列化 JSON

具有特殊字符的 C# 变量名

java - 斯坦福 LexParser 多线程

c# - 使用 Parallel.ForEach() 的 yield return 的线程安全

c# - SynchronizationContext.CreateCopy 的目的

c# - 仅在延迟时间后执行方法

.net - SpecFlow - 您如何正确使用功能文件中的 "Background:"命令?