gpt4 book ai didi

c# - 傻瓜线程队列

转载 作者:太空狗 更新时间:2023-10-29 21:25:55 29 4
gpt4 key购买 nike

我认为这是一个非常常见的线程场景:

  • 我有 100 个相同的工作要完成
  • 所有的工作都是独立的其他
  • 我最多要处理一次 15 个工作
  • 作为每份工作完成,将开始新的工作直到所有工作完成

如果您假设每个作业在他完成时都会触发一个事件(我使用的是 BackgroundWorker 类),我可以想出几种方法来实现这一点,但我不确定什么是“正确的”解决方案是。我希望你们中的一些专家能为我指明正确的方向。

解决方案 1: while(continue) { Threading.Sleep(1000); } 在我的 Main() 函数中循环。 Job_Completed 事件处理程序中的代码将在 A) 没有待排队的作业并且B) 所有排队的作业已完成时设置 continue = false。我以前使用过这个解决方案,虽然它似乎工作正常......对我来说似乎有点“奇怪”。

解决方案 2: 在我的 Main() 函数中使用 Application.Run()。同样,Job_Completed 事件处理程序中的代码将在A)没有待排队的作业并且B)所有排队的作业已完成时调用 Application.Exit()。

解决方案 3:使用线程池,将所有 500-1000 个请求排队,让它们一次运行 10 个 (SetMaxThreads) 并以某种方式等待它们全部完成。

在所有这些解决方案中,基本思想是每次完成另一个作业时都会启动一个新作业,直到没有剩余作业为止。因此,问题不仅在于等待现有作业完成,而且还要等待直到不再有任何待处理的作业才能启动。如果 ThreadPool 是正确的解决方案,那么等待 ThreadPool 完成所有排队项目的正确方法是什么?

我认为我最困惑的是我不明白事件是如何从我的 Main() 函数中触发的。显然他们这样做,我只是不从 Windows 消息循环的角度理解它的机制。解决这个问题的正确方法是什么,为什么?

最佳答案

即使其他答案很好,如果您想要另一个选项(您永远不会有足够的选项),那么这个作为一个想法怎么样。

只需将每个作业的数据放入一个结构中,该结构位于 FIFO 堆栈中。

创建 15 个线程。

每个线程都会从堆栈中获取下一个作业,将其弹出。

当一个线程完成处理后,获取下一个作业,如果堆栈为空则线程死亡或只是休眠,等待。

唯一的复杂性,也很容易解决,是在关键部分中弹出(同步读取/弹出)。

关于c# - 傻瓜线程队列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/795842/

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