在我们当前的项目中,对于某些操作,我们将消息发送到数据库,如COMPLETED-Order,STARTED-Request,REJECTED-Order以及OrderId等相关信息....所有消息都对应一个实现命令模式的Command类。 / p>
interface ICommand
{
void Execute();
}
public class RequestStartedCommand:ICommand
{
public void Execute()
{
//do the related work.....
}
}
//other commands...
Windows服务使用此消息然后将它们转换为命令以上并通过ThreadPool执行命令。
但是在其他命令(如OrderID = 23的COMPLETED-Order命令)之前需要执行某些命令,必须在同一命令的REJECTED-Order命令之前执行。我该怎么办?或者我应该遵循哪种策略?任何示例或文档都是有用的。
答案 0 :(得分:1)
我会尝试实现一些依赖性检查。像被拒绝的命令命令之类的东西需要在执行之前检查某个状态是否有效。 经理/服务部门从列表中获取命令,应用其验证检查并将其返回到列表(如果此类验证未完成)。
要小心饥饿,或者让命令永远陷入名单。
答案 1 :(得分:0)
我们一直在使用Ami Bar撰写的Smart Thread Pool来实现这一目标。它已经生产了几年,之所以被选中,是因为我们发现当时缺乏.NET 1.1中的实现。
STP实现了工作项组,如果将组的并发线程数设置为1,则可以使用这些组对相关工作项进行排队。对于50-100个在线客户端,我们在使用它时没有遇到任何问题。
答案 2 :(得分:0)
我会创建一个将命令链接在一起并使用事件通知其他命令完成,成功,失败或取消命令的方法。查看观察者模式(http://en.wikipedia.org/wiki/Observer_pattern),了解如何传递这些通知。另外,要注意命令中的循环依赖关系,这样如果两个命令相互等待,那么任何一个命令都不会执行。我可能会使用事件来实现它。
答案 3 :(得分:0)
如果您正在使用线程池,则可能有一个请求队列。您可以向队列中的每个请求对象添加一组依赖请求。主请求完成后,让线程proc将依赖请求作为主要请求放在队列中:
class RequestObject {
// ... request details
List <RequestObject> dependentRequests;
}
void PerformRequest (RequestObject request)
{
// ... perform the requested object
foreach ( var dr in request.dependentRequests )
AddRequestToQueue (dr);
}