sha*_*p00 10 c# service multitasking
我有一个与数据库交互的C#服务应用程序.它最近从.NET 2.0迁移到.NET 4.0,因此我们可以使用大量新工具.
我正在寻找编程方法或工具/库的指针来处理定义任务,配置他们依赖的任务,排队,优先排序,取消等.
有各种类型的服务:
这些服务通常彼此依赖并且按需触发,即报告任务,其中可能包含代码,例如
if (IsSomeDependentCalculationRequired())
PerformDependentCalculation(); // which may trigger further calculations
GenerateRequestedReport();
Run Code Online (Sandbox Code Playgroud)
此外,任何数据修改都可能Required
在某些计算或报告服务上设置标志(因此报告在完成生成之前可能已过期).任务的长度从几秒到几分钟不等,并在交易中执行.
到目前为止,这已经很好用了,但它的扩展性不好.有一些基本的设计问题,我希望重写这部分代码.例如,如果两个用户在相似时间请求相同的报告,则依赖任务将被执行两次.此外,目前无法取消正在进行的任务.维护依赖任务很难.
我不是在寻找有关如何实施修复的建议.相反,如果我从头开始使用.NET 4,那么我正在寻找指向我将用于此类要求的工具/库的指针.这是Windows Workflow的一个很好的候选者吗?这是期货的用途吗?我应该看看还有其他图书馆吗?我应该阅读的书籍或博客文章?
编辑:关于什么的Rx无扩展?
我认为您的要求不适合任何内置的东西。您的要求太具体了。
我建议您围绕 SQL 数据库构建任务队列基础设施。您的任务运行时间相当长(数秒),因此任务计划程序不需要特别高的吞吐量。这意味着您不会遇到性能障碍。从编程的角度来看,这实际上是一个非常容易管理的任务。
也许您应该构建一个 Windows 服务或一些其他进程来不断轮询数据库以查找新任务或请求。然后,该服务可以对请求的任务强制执行任意规则。例如,它可以检测到报告任务已经在运行,并且不安排新的计算。
我的主要观点是,您的要求非常具体,您需要使用 C# 代码对其进行编码。您无法使现有工具满足您的需求。您需要编程语言的图灵完整性才能自己完成此操作。
编辑:您可能应该将任务请求与任务执行分开。这允许多方请求刷新某些报告,同时只有一个实际计算正在运行。一旦这个单一计算完成,所有任务请求都被标记为已完成。当请求被取消时,不需要取消执行。仅当最后一个请求被取消时,任务执行也会被取消。
编辑2:我不认为工作流程是解决方案。工作流程通常彼此分开运行。但你不希望这样。您希望拥有跨越多个任务/工作流程的规则。您将使用基于工作流的模型针对系统进行工作。
编辑 3:关于 TPL(任务并行库)的几句话。你提到过它(“期货”)。如果您想了解任务如何协同工作、如何创建依赖关系以及如何组合任务,请查看任务并行库(特别是 Task 和 TaskFactory 类)。你会在那里发现一些不错的设计模式,因为它设计得非常好。以下是对任务序列进行建模的方法:调用 Task.ContinueWith ,它将注册一个延续函数作为新任务。以下是对依赖关系进行建模的方法: TaskFactory.WhenAll(Task[]) 启动一个仅在所有输入任务完成时才运行的任务。
但是:TPL 本身可能不太适合您,因为它的任务无法保存到磁盘。当您重新启动服务器或部署新代码时,所有现有任务都将被取消,并且进程将中止。这可能是不可接受的。请仅使用 TPL 作为灵感。从中了解什么是“任务/未来”以及如何组成它们。然后实施你自己的任务形式。
这有帮助吗?
归档时间: |
|
查看次数: |
706 次 |
最近记录: |