gpt4 book ai didi

multithreading - 使用 .NET 4 任务而不是 Thread.QueueUserWorkItem

转载 作者:行者123 更新时间:2023-12-04 06:53:01 25 4
gpt4 key购买 nike

我一直在阅读有关 .NET 4 中新 TPL 的大量文章。其中大多数建议使用任务来替代 Thread.QueueUserWorkItem。但据我了解,任务不是线程。那么在以下场景中会发生什么,我想在 .NET 4 中使用新的 BlockingCollection 类来使用生产者/消费者队列:

  1. 队列使用一个参数(例如 100)进行初始化,以指示工作任务的数量。调用 Task.Factory.StartNew() 以创建一堆任务。

  2. 然后新的工作项被添加到队列中,消费者接受这个任务并执行它。

现在,基于上述内容,您可以同时执行的任务数量似乎有限制,在使用 Thread.QueueUserWorkItem 时,CLR 将使用具有默认池大小的线程池。

基本上我想做的是弄清楚在我想创建一个 Windows 服务轮询数据库以查找准备运行的作业的情况下,将任务与 BlockingCollection 结合使用是合适的。如果作业已准备好执行,Windows 服务中的计时器(我唯一的生产者)将向队列中添加一个新的工作项,然后该工作将被工作任务拾取并执行。

在这种情况下使用生产者/消费者队列是否有意义?那么工作任务的数量呢?

最佳答案

我不确定使用生产者/消费者队列是否是最好的模式,但考虑到线程问题。正如我所相信的。 .NET4 任务仍然作为线程运行,但是您不必担心这些线程的调度,因为 .NET4 为其提供了一个很好的接口(interface)。
使用任务的主要优点是:

  • 您可以根据需要将其中的多个排队,而无需为传递给 Thread.QueueUserWorkItem 的每个排队工作项增加 1M 的内存开销。
  • 它还将管理您的任务将在哪些线程和处理器上运行,以改进数据流和缓存。
  • 您可以为您的任务建立一个依赖层次结构。
  • 它会自动尽可能多地使用您机器上可用的内核。

关于multithreading - 使用 .NET 4 任务而不是 Thread.QueueUserWorkItem,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3079954/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com