1

一个问题是特定资源每秒不能处理超过 1 个请求,我想将该参数传递给一个线程池,该线程池管理对该资源的所有并发调用。

有没有提供这种自定义线程池的库,或者我应该期待实现自己的?

4

6 回答 6

1

如果您使用的是 .NET 4,则可以使用 aBlockingCollection<T>来完成此操作。

您可以将您的工作项从应用程序中的多个线程添加到阻塞集合中,然后有一个专用线程调用GetConsumingEnumerable()来拉出项目,并在处理每个元素后休眠所需的时间以将每秒请求限制为 1 个。

于 2010-08-06T19:59:34.227 回答
0

我会分离一个线程,将其包装在互斥锁中,并强制它在释放锁之前等待一秒钟。这样,在任何生成这些线程的进程中,每个新线程都必须排队才能访问该过程。

第二个线程将立即分拆,但由于互斥锁,也会立即排队。

例如

{
Thread t = new Thread(()=>{DoSomething();}).Start();
Thread t2 = new Thread(()=>{DoSomething();}).Start();
}

private static Mutex _mutex = new Mutex();
private void DoSomething()
{
   _mutex.WaitOne();
   // Do Work
   Sleep(1000);
   _mutex.ReleaseMutex();
}

或者,如果您真的想具体一点,您可以使用 System.Diagnostics 类来跟踪程序从开始到结束的执行情况,并使您的 Thread.Sleep 只等待执行时间的差异。

有点胡闹。=)

于 2010-08-06T20:00:40.113 回答
0

如果您只有一个资源,那么您可以使用一个输入线程来提供资源。输入线程也可以有一个输入队列,所有“任务生产者”都在其中提供请求或作业。线程之间的事情可能是阻塞队列:

阻塞队列

于 2010-08-06T19:57:59.643 回答
0

我认为不需要线程池;

  • 让所有并发都将作业放入 concurrentQueue<>
  • 有一个线程从队列中抓取一个项目,处理后它会在处理下一个之前休眠一秒钟
  • 可以选择使用计时器每秒一次而不是线程来获取下一个计时器。
于 2013-04-08T10:50:40.460 回答
0

您可以使用Microsoft Devlabs 的反应式扩展。有一个特殊的Throttle算子可以限制 Observable 的处理速率。

请注意,Reactive Extensions不是最终产品,但您可以自由使用和分发当前形式的库。

于 2010-08-06T21:00:57.323 回答
0

可能想看看Quartz.Net

于 2010-08-06T21:05:01.667 回答