我正在创建一个包含 2 个独立组件的 Windows 服务: 1 个组件创建作业并将其插入数据库(1 个线程) 第二个组件处理这些作业(线程池中的多个固定线程数)
只要服务在运行,这 2 个组件就会一直运行。
我坚持的是确定如何实现这个线程池。我做了一些研究,似乎有很多方法可以做到这一点,例如创建一个覆盖方法“ThreadPoolCallback”的类,以及使用 ThreadPool.QueueUserWorkItem 对工作项进行排队。 http://msdn.microsoft.com/en-us/library/3dasc8as.aspx
但是在给出的示例中,它似乎不适合我的场景。我想最初在线程池中创建固定数量的线程。然后将作业提供给它进行处理。我该怎么做?
//与线程池一起使用的包装器方法。
public void ThreadPoolCallback(Object threadContext)
{
int threadIndex = (int)threadContext;
Console.WriteLine("thread {0} started...", threadIndex);
_fibOfN = Calculate(_n);
Console.WriteLine("thread {0} result calculated...", threadIndex);
_doneEvent.Set();
}
Fibonacci[] fibArray = new Fibonacci[FibonacciCalculations];
const int FibonacciCalculations = 10;
for (int i = 0; i < FibonacciCalculations; i++)
{
ThreadPool.QueueUserWorkItem(f.ThreadPoolCallback, i);
}
最佳答案
创建一个 BlockingCollection的工作项目。创建作业的线程将它们添加到此集合中。
创建固定数量的持久线程,从 BlockingCollection
读取项目并处理它们。像这样的东西:
BlockingCollection<WorkItem> WorkItems = new BlockingCollection<WorkItem>();
void WorkerThreadProc()
{
foreach (var item in WorkItems.GetConsumingEnumerable())
{
// process item
}
}
多个工作线程可以同时进行。 BlockingCollection
支持多个读取器和写入器,因此您无需处理并发问题。
查看我的博文 Simple Multithreading, part 2例如,使用一个消费者和一个生产者。添加多个消费者是为每个消费者启动一个新任务的非常简单的事情。
另一种方法是使用信号量来控制当前正在处理的作业数量。我在 this answer 中展示了如何做到这一点.但是,我认为共享 BlockingCollection
通常是更好的解决方案。
关于c# - Window 服务中的线程池?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20429716/