我正在寻找指向编程方法或工具/库的指针来处理定义任务,配置它们依赖的任务,排队,优先排序,取消等.
有各种类型的服务:
>数据(用于检索和更新)
>计算(使用数据计算的结果填充一些表)
>报告
这些服务通常依赖于彼此触发,并且是按需触发的,即报告任务可能在其中具有代码
if (IsSomeDependentCalculationrequired()) PerformDependentCalculation(); // which may trigger further calculations GenerateRequestedReport();
此外,任何数据修改都可能在某些计算或报告服务上设置“必需”标志(因此报告可能在生成完成之前过期).这些任务的长度从几秒到几分钟不等,并且在事务中执行.
到目前为止,这一直很好,但是它的扩展性不好.有一些基本的设计问题,我正在寻求重写这部分代码.例如,如果两个用户在相似的时间请求相同的报告,则依赖的任务将被执行两次.此外,目前还没有办法取消正在进行的任务.维护从属任务很难等等.
我不是在寻找有关如何实施修复的建议.相反,如果我从头开始在.NET 4中,我正在寻找指向用于这种需求的工具/库的指针.这将是Windows Workflow的好候选人吗?这是Futures是什么?我应该看看还有什么其他图书馆,还有我应该阅读的书籍或博客文章?
编辑:Rx Reactive Extensions怎么办?
解决方法
我建议您在sql数据库周围构建一个排队基础架构的任务.您的任务相当长时间运行(秒),因此在任务调度程序中不需要特别高的吞吐量.这意味着你不会遇到性能障碍.从编程的角度来看,它实际上是一个很好的可管理的任务.
您可能应该构建一个Windows服务或其他一些持续轮询数据库以获取新任务或请求的进程.然后,该服务可以对所请求的任务执行任意规则.例如,它可以检测到报告任务已经在运行,而不是计划新的计算.
我的主要观点是,您的要求是具体要求,您需要使用C#代码对其进行编码.您不能使现有的工具符合您的需求.您需要一种编程语言的完整性才能自己做.
编辑:您应该将任务请求与任务执行分开.这允许多方请求刷新一些报告,同时只有一个实际计算正在运行.一旦完成了这个单一的计算,所有的任务请求被标记为已完成.当请求被取消时,不需要取消执行.只有当最后一个请求被取消时,任务执行也被取消.
编辑2:我不认为工作流是解决方案.工作流程通常彼此分开操作.但你不想要那个.您希望拥有涵盖多个任务/工作流的规则.您将使用基于工作流的模型来处理系统.
编辑3:关于TPL(Task Parallel Library)的几个字.你提到它(“期货”).如果你想要一些启发任务如何一起工作,如何创建依赖关系以及如何组合任务,请查看任务并行库(特别是Task和TaskFactory类).你会发现一些很好的设计模式,因为它是非常好的设计.以下是您如何建立一系列任务:您调用Task.ContinueWith将会将续延函数注册为新任务.以下是您如何建立依赖关系:TaskFactory.WhenAll(Task [])启动仅在其所有输入任务完成时运行的任务.
但是:TPL本身可能不太适合您,因为它的任务无法保存到磁盘.当您重新启动服务器或部署新代码时,所有现有任务都将被取消,并且进程中止.这可能是不可接受的.请使用TPL作为灵感.从中学到什么是“任务/未来”,以及如何组成.然后实现你自己的任务形式.
这有帮助吗