gpt4 book ai didi

c# - Window 服务中的线程池?

转载 作者:太空宇宙 更新时间:2023-11-03 13:31:20 25 4
gpt4 key购买 nike

我正在创建一个包含 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/

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