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

标签 c# multithreading windows-services

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

相关文章:

java - C# 和 Java 规范在有符号整数溢出时是否阐明了相同的行为?

javascript - 在 C#.net Winform 应用程序中获取和设置 CKEditor HTML

vb.net - 如何在单独的线程中创建加载器?

python - 并行化Python列表理解并没有提高性能

c# - WCF - 最快的进程间通信

c# - 如何调用 method_getImplementation 的 IntPtr 结果

c# - 使用异步 Web 服务时,什么应该 "await"什么不应该?

c# - Windows 服务中托管的 WCF 服务无法正常运行

winapi - 我可以在进程之间传递 SC_HANDLE 吗?

c# windows 服务还是普通程序?