gpt4 book ai didi

c# - 是否有一种标准模式可以避免由于单个任务阻塞而导致作业队列延迟?

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

我有一个基本的任务执行队列(与 3 个独立系统对话的 c# WinForms 应用程序)。一切都很好,直到其中一项 Web 服务决定不以通常的速度响应。

我对通过多线程作业加快速度不感兴趣,但现在我在生产中使用它,我可以看到至少有两个线程运行作业的好处 - 如果一个阻塞并且它是异常的,另一个将保持 truckin',如果两个都阻塞,那么可能会有任意数量的线程,而我只是处理它。

所以,问题是:这是我刚刚描述的常见模式吗,是否有该模式的名称和/或一些很棒的引用或框架,或任何帮助我不重新发明任何轮子的东西。

基于评论/答案的添加

任务可以同时运行。为了速度的目的,我选择不仔细研究多线程设计,但我现在正在考虑它以在面对不常见的任务延迟时获得一致的性能。

我的假设是,每隔一段时间,对 Web 服务的调用需要不成比例的时间才能完成,但仍被认为是正常的。如果平均执行时间为 1 秒(包括大量不同的 Web 服务调用)并且 Web 服务花费的时间为 0.0001%,则这对总运行时间(例如 N 个作业)的影响不可忽略15 秒响应。

线程池只是“启动工作线程并手动管理它们的状态”的另一种说法吗?或者有什么可以帮助我管理复杂性的东西吗?我担心在这种情况下引入错误的机会与 yield 不成比例......

我想我正在寻找类似于线程池的东西,但它只会在检测到延迟时启动额外的线程。

如果有人能给我更多关于其中一条评论所指的工作窃取线程的信息,那听起来很有希望。

我没有使用 BackgroundWorker 组件的原因是因为它们似乎是为您知道需要多少 worker 的情况而构建的,理想情况下我会保持设计的灵 active

PS:再次感谢。谢谢!

最佳答案

这取决于队列项目的顺序有多重要,以及在处理下一个项目之前完成一个项目的重要性。如果一项必须在下一项之前完成处理,那么基本上你就被卡住了。如果没有,您可以决定实现一个简单的工作线程池。如果 .NET 4.0 是一个选项,我建议为此使用并行扩展,尤其是 AsParallel() 和 AsOrdered() 方法。

关于c# - 是否有一种标准模式可以避免由于单个任务阻塞而导致作业队列延迟?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3659966/

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