有哪些C#工具可用于触发,排队,确定相关任务的优先级

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无扩展

usr*_*usr 4

我认为您的要求不适合任何内置的东西。您的要求太具体了。

我建议您围绕 SQL 数据库构建任务队列基础设施。您的任务运行时间相当长(数秒),因此任务计划程序不需要特别高的吞吐量。这意味着您不会遇到性能障碍。从编程的角度来看,这实际上是一个非常容易管理的任务。

也许您应该构建一个 Windows 服务或一些其他进程来不断轮询数据库以查找新任务或请求。然后,该服务可以对请求的任务强制执行任意规则。例如,它可以检测到报告任务已经在运行,并且不安排新的计算。

我的主要观点是,您的要求非常具体,您需要使用 C# 代码对其进行编码。您无法使现有工具满足您的需求。您需要编程语言的图灵完整性才能自己完成此操作。

编辑:您可能应该将任务请求与任务执行分开。这允许多方请求刷新某些报告,同时只有一个实际计算正在运行。一旦这个单一计算完成,所有任务请求都被标记为已完成。当请求被取消时,不需要取消执行。仅当最后一个请求被取消时,任务执行也会被取消。

编辑2:我不认为工作流程是解决方案。工作流程通常彼此分开运行。但你不希望这样。您希望拥有跨越多个任务/工作流程的规则。您将使用基于工作流的模型针对系统进行工作。

编辑 3:关于 TPL(任务并行库)的几句话。你提到过它(“期货”)。如果您想了解任务如何协同工作、如何创建依赖关系以及如何组合任务,请查看任务并行库(特别是 Task 和 TaskFactory 类)。你会在那里发现一些不错的设计模式,因为它设计得非常好。以下是对任务序列进行建模的方法:调用 Task.ContinueWith ,它将注册一个延续函数作为新任务。以下是对依赖关系进行建模的方法: TaskFactory.WhenAll(Task[]) 启动一个仅在所有输入任务完成时才运行的任务。

但是:TPL 本身可能不太适合您,因为它的任务无法保存到磁盘。当您重新启动服务器或部署新代码时,所有现有任务都将被取消,并且进程将中止。这可能是不可接受的。请仅使用 TPL 作为灵感。从中了解什么是“任务/未来”以及如何组成它们。然后实施你自己的任务形式。

这有帮助吗?