代码之家  ›  专栏  ›  技术社区  ›  Aaron Anodide

是否有一个标准模式来避免由于单个被阻止的任务而导致的作业队列延迟?

  •  1
  • Aaron Anodide  · 技术社区  · 15 年前

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

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

    基于评论/答案的补充

    这些任务可以同时运行。为了提高速度,我选择不细读多线程设计,但我现在考虑在不频繁的任务延迟面前实现一致的性能。

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

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

    如果有人能给我提供更多关于其中一条评论所指的偷工减料的信息,那听起来很有希望。

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

    PS:再次感谢。 谢谢!

    4 回复  |  直到 15 年前
        1
  •  3
  •   Johann Blais    15 年前

    这取决于队列项目的顺序有多重要,以及在处理下一个项目之前完成一个项目有多重要。 如果一个项目必须在下一个项目完成之前完成,那么基本上你就卡住了。

        2
  •  1
  •   Mark    15 年前

    http://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker.aspx . 它的使用既快捷又简单,只需连接DoWork、ProgressChanged和RunWorkerCompleted事件,然后启动它。

        3
  •  1
  •   Ed Power    15 年前

    生产者-消费者模式可能最适合这种情况,使用队列(或者 Queue<T> lock 还是新的 ConcurrentQueue<T>

    如果您想使用超过两个同时的web连接的最大默认值,请将其添加到您的应用程序配置(将“10”替换为新的最大值):

    <configuration>
      <system.net>
        <connectionManagement>
          <add address="*" maxconnection="10"/>
        </connectionManagement>
      </system.net>
    </configuration>
    
        4
  •  0
  •   user348905 user348905    15 年前