代码之家  ›  专栏  ›  技术社区  ›  caltuntas

取决于其他任务完成情况的线程池任务

  •  1
  • caltuntas  · 技术社区  · 16 年前

    在我们当前的项目中,对于某些操作,我们会向数据库发送消息,如已完成的订单、已启动的请求、已拒绝的订单以及相关信息,如orderid…。所有消息都对应一个实现命令模式的命令类。

    interface ICommand
    {
       void Execute();
    }
    
    public class RequestStartedCommand:ICommand
    {
       public void Execute()
       {
         //do the related work.....
       }
    }
    
    //other commands...
    

    Windows服务使用这些消息,然后将它们转换为以上命令,并通过线程池执行命令。

    但有些命令需要在其他命令(如orderid=23的已完成订单命令)之前执行,而同一订单的已拒绝订单命令之前必须执行。我如何才能做到这一点,或者我应该遵循哪个策略?任何例子或文件都是有用的。

    4 回复  |  直到 16 年前
        1
  •  1
  •   Adriaan Stander    16 年前

    我会尝试实现一些依赖性检查。类似于被拒绝的订单命令,在执行之前需要检查状态是否有效。 管理器/服务应该从列表中获取命令,应用其验证检查,如果验证未完成,则将其返回到列表。

    当心饥饿,或是命令永远被困在名单上。

        2
  •  0
  •   EventHorizon    16 年前

    我们一直在使用 Smart Thread Pool 由AmiBar编写完成。它已经投入生产几年了,之所以被选中,是因为我们发现在.NET 1.1中的实现当时缺乏。

    STP实现工作项组,如果将组的并发线程数设置为1,则可以使用这些工作项组对相关工作项进行排队。对于50-100个在线客户,我们在使用它时没有遇到任何问题。

        3
  •  0
  •   Jeff Tucker    16 年前

    我将创建一个方法将命令链接在一起,并使用事件通知其他命令完成、成功、失败或取消的命令。查看观察者模式( http://en.wikipedia.org/wiki/Observer_pattern )了解如何传递这些通知。另外,要注意命令中的循环依赖关系,因此如果两个命令相互等待,那么两个命令都不会执行。我可能会使用事件来实现这一点。

        4
  •  0
  •   XXXXX    16 年前

    如果您使用的是线程池,那么您可能有一个请求队列。您可以向队列中的每个请求对象添加依赖请求的集合。当主请求完成时,让线程进程将队列上的从属请求作为主请求:

    class RequestObject {
        // ... request details
        List <RequestObject> dependentRequests;
    }

    void PerformRequest(请求对象请求) { /…执行请求的对象 foreach(请求中的var dr.dependentRequests) 将请求添加到队列(dr); }