1

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

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

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

基于评论/答案的补充

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

我的假设是,每隔一段时间,对 Web 服务的调用就会花费不成比例的更长的时间来完成,同时仍然被认为是非异常的。如果平均执行时间为 1 秒(包括大量不同的 Web 服务调用)和 Web 服务所用时间的 0.0001%,那么这对 N 个作业的总运行时间的影响可以忽略不计。 15秒回复。

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

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

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

我没有使用 BackgroundWorker 组件的原因是因为它们似乎是为您知道需要多少工人的情况而构建的,而且我最好保持设计的灵活性

PS:再次感谢。谢谢!

4

4 回答 4

3

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

于 2010-09-07T15:33:11.933 回答
1

听起来您可能在这里寻找的是Backgroundworker。一个巧妙地封装启动工作线程、监控进度和接收结果的类。http://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker.aspx。只需连接 DoWork、ProgressChanged 和 RunWorkerCompleted 事件,然后启动它即可快速且易于使用。

于 2010-09-07T15:26:08.020 回答
1

生产者-消费者模式可能最适合这种情况,并且使用队列(Queue<T>包装在 alock或 new中ConcurrentQueue<T>)是一种好方法。它还为您提供了回收因超时或连接断开而失败的 Web 服务请求的地方。

如果您想使用超过两个同时 Web 连接的最大默认值,请将其添加到您的 app.config(将“10”替换为新的最大值):

<configuration>
  <system.net>
    <connectionManagement>
      <add address="*" maxconnection="10"/>
    </connectionManagement>
  </system.net>
</configuration>
于 2010-09-07T16:39:19.077 回答
0

如果您使用的是 .Net 4,您还可以查看 Tasks

于 2010-12-22T01:09:13.453 回答