【问题标题】:What is the best way to throttle many .NET Task instances?限制许多 .NET Task 实例的最佳方法是什么?
【发布时间】:2011-02-17 21:27:03
【问题描述】:

我创建了大量的 Task 实例。我需要全部运行它们,并等待它们全部完成。问题是我需要确保在任何给定时间在“开始”和“完成”之间不超过 X 个任务;这些任务涉及到对同时呼叫数量有限制的其他方的呼叫。由于这些限制不是基于我的硬件,我不能依赖任何内置的智能节流;我需要严格执行限制。我已经能够通过让任务以线程安全的方式增加和减少共享变量来做到这一点,但这似乎不必要地麻烦。有没有一种更直接地内置到 API 中的方法,或者我缺少一个简单的同步工具?

【问题讨论】:

  • 信号量对我来说是个不错的解决方案。

标签: .net multithreading scheduling task


【解决方案1】:

你必须创建自己的任务调度器,见How to: Create a Task Scheduler That Limits the Degree of Concurrency

编辑:这需要比使用信号量更多的代码,但我觉得这可能会执行得更好,因为执行任务的线程池不知道你的信号量,但使用 TaskScheduler 正在播放按照他们的规则。

编辑 2: 使用信号量的一个可能的缺点是线程池可能认为您的任务正在执行 IO 操作并一次调度它们很多(这样它们就会挂在那里等待,因为他们不需要CPU)。使用 TaskScheduler,他们将在有位置的时候准确安排。它肯定会保持游泳池清洁。

【讨论】:

    【解决方案2】:

    信号量类可能适合你:http://msdn.microsoft.com/en-us/library/system.threading.semaphore.aspx

    在这个 MSDN 页面上有一个很好的例子来告诉你如何使用它。

    可能还有更轻量级的内置线程池/同步机制,您可以使用它来完成相同的目的,但 Semaphore 基本上是为满足您的要求而设计的。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-03
    • 1970-01-01
    相关资源
    最近更新 更多