如何解决C# - 带有插槽的工作线程,动态添加项目
我有窗口服务,每 30 秒轮询一次 Web 服务以获取新项目。如果它发现任何新项目,它会检查它们是否需要“处理”,然后将它们放入一个列表中进行处理。我生成不同的线程以一次处理 5 个,当一个线程完成时,另一个线程将填充空槽。一切都完成后,程序会休眠 30 秒,然后再次轮询。
我的问题是,在处理项目时(最多可能需要 15 分钟),正在创建可能也需要处理的新项目。我的问题是主线程在等待每个最后一个线程完成后才进入睡眠状态并重新开始整个进程。
我想要做的是让主线程继续每 30 秒轮询一次 Web 服务,但是不要被阻止,而是将它找到的任何新项目添加到列表中,该列表将在单独的工作程序中处理线。在那个工作线程中,它仍然会说只有 5 个可用的插槽,但它们基本上总是被填满,假设主线程继续寻找要处理的新项目。
我希望这是有道理的。谢谢!
编辑:更新的代码示例
我把它作为一个在 ConcurrentQueue 上运行的工作线程组合在一起。有什么办法可以改善吗?
private void ThreadWorker() {
DateTime dtStart = DateTime.Now;
int iNumOfConcurrentSlots = 6
Thread[] threads = new Thread[iNumOfConcurrentSlots];
while (true) {
for (int i = 0; i < m_iNumOfConcurrentSlots; i++) {
if (m_tAssetQueue.TryDequeue(out Asset aa)) {
threads[i] = new Thread(() => ProcessAsset(aa));
threads[i].Start();
Thread.Sleep(500);
}
}
}
}
编辑:啊,是的,上面不起作用。我需要一种能够不对 ConcurrentSlots 的数量进行硬编码的方法,但是让每个线程基本上都在等待并在 Queue 中寻找某些东西,如果找到,则对其进行处理。但是我还需要一种方法来表明 ProcessAsset() 函数已完成以释放线程并允许创建另一个线程....
解决方法
一种简单的方法是让 5 个线程从并发队列中读取。主线程对项目进行排队,而工作线程会阻塞队列中的读取。
注意:工人处于无限循环中。他们调用 TryDequeue,如果他们得到一个就处理这个项目,或者如果他们没有得到一些东西就休眠一秒钟。他们还可以检查退出标志。
为了使您的服务属性正常运行,您可能有一个独立的轮询线程来对项目进行排队。主线程保持响应启动、停止、暂停请求。
工作线程的伪代码:
While true
If TryDequeue then
process data
If exit flag is true,break
While pause flag,sleep
Sleep
轮询线程的伪代码:
While true
Poll web service
Queue items in concurrent queue
If exit flag true,sleep
Sleep
主线程伪代码:
Start polling thread
Start n worker threads with above code
Handle stop:
set exit flag to true
Handle pause
set pause flag to true
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。