加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 虚拟对象的线程队列

发布时间:2020-12-15 08:27:58 所属栏目:百科 来源:网络整理
导读:我有我认为是一个非常常见的线程场景: 我有100个相同的工作要完成 所有工作都是独立的 其他 我想最多处理 一次15个工作岗位 作为每份工作 完成后,将开始一项新工作 直到所有工作完成 如果你假设每个作业在他完成时会触发一个事件(我正在使用BackgroundWorke
我有我认为是一个非常常见的线程场景:

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

如果你假设每个作业在他完成时会触发一个事件(我正在使用BackgroundWorker类),我可以想出几种方法来解决这个问题,但我不确定“正确”的解决方案是什么.我希望你们中的一些大师可以指出我正确的方向.

解决方案1:有一段时间(继续){Threading.Sleep(1000);在我的Main()函数中循环.当A)没有任何作业要排队并且B)所有排队的作业都已完成时,Job_Completed事件处理程序中的代码将设置continue = false.我之前和之前都使用过这个解决方案似乎工作得很好……对我来说似乎有些“奇怪”.

解决方案2:在Main()函数中使用Application.Run().类似地,Job_Completed事件处理程序中的代码将在A)没有要排队的作业和B)所有排队的作业完成时调用Application.Exit().

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

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

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

解决方法

即使其他答案很好,如果你想要另一个选项(你永远不会有足够的选择),那么这个想法如何.

只需将每个作业的数据放入一个FIFO堆栈中的结构中.

创建15个线程.

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

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

唯一的复杂性,即解决起来非常简单,就是让弹出窗口处于关键部分(同步读取/弹出).

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读