一个问题是特定资源每秒不能处理超过 1 个请求,我想将该参数传递给一个线程池,该线程池管理对该资源的所有并发调用。
有没有提供这种自定义线程池的库,或者我应该期待实现自己的?
一个问题是特定资源每秒不能处理超过 1 个请求,我想将该参数传递给一个线程池,该线程池管理对该资源的所有并发调用。
有没有提供这种自定义线程池的库,或者我应该期待实现自己的?
如果您使用的是 .NET 4,则可以使用 aBlockingCollection<T>
来完成此操作。
您可以将您的工作项从应用程序中的多个线程添加到阻塞集合中,然后有一个专用线程调用GetConsumingEnumerable()来拉出项目,并在处理每个元素后休眠所需的时间以将每秒请求限制为 1 个。
我会分离一个线程,将其包装在互斥锁中,并强制它在释放锁之前等待一秒钟。这样,在任何生成这些线程的进程中,每个新线程都必须排队才能访问该过程。
第二个线程将立即分拆,但由于互斥锁,也会立即排队。
例如
{
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 只等待执行时间的差异。
有点胡闹。=)
如果您只有一个资源,那么您可以使用一个输入线程来提供资源。输入线程也可以有一个输入队列,所有“任务生产者”都在其中提供请求或作业。线程之间的事情可能是阻塞队列:
我认为不需要线程池;
您可以使用Microsoft Devlabs 的反应式扩展。有一个特殊的Throttle算子可以限制 Observable 的处理速率。
请注意,Reactive Extensions不是最终产品,但您可以自由使用和分发当前形式的库。
可能想看看Quartz.Net