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

标签 c# service multitasking

我有一个与数据库交互的 C# 服务应用程序。它最近从 .NET 2.0 迁移到了 .NET 4.0,因此我们可以使用大量新工具。

我正在寻找指向编程方法或工具/库的指针,以处理定义任务、配置它们所依赖的任务、排队、确定优先级、取消等。

有多种类型的服务:

  • 数据(用于检索和更新)
  • 计算(用数据计算的结果填充一些表)
  • 报告

这些服务通常相互依赖并按需触发,即报告任务,其中可能包含代码,例如

if (IsSomeDependentCalculationRequired())
    PerformDependentCalculation();  // which may trigger further calculations
GenerateRequestedReport();

此外,任何数据修改都可能在某些计算报告上设置Required标志服务,(因此报告可能在完成生成之前就已经过时了)。任务的长度从几秒到几分钟不等,并在事务内执行。

到现在为止一切正常,但扩展性不佳。存在基本的设计问题,我希望重写这部分代码。例如,如果两个用户在相似的时间请求同一份报告,相关任务将被执行两次。此外,目前无法取消正在进行的任务。难以维护依赖任务等。

我不是在寻找有关如何实现修复的建议。相反,我正在寻找指向如果我从头开始使用 .NET 4 时将使用哪些工具/库来满足此类要求的指针。这会是 Windows Workflow 的一个很好的候选者吗? ?这是什么Futures是给?还有其他我应该看的图书馆或我应该阅读的书籍或博客文章吗?

编辑 Rx Reactive Extensions 怎么样? ?

最佳答案

我认为您的要求不符合任何内置内容。您的要求太具体了。

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

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

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

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

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

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

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

这有帮助吗?

关于c# - 有哪些 C# 工具可用于触发、排队、确定相关任务的优先级,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9132184/

相关文章:

c - 错误 C2275 : illegal use of this type as an expression

multithreading - 多线程设计模式

ios - SpriteKit 游戏中的多任务问题

c# - @Html.DropDownListFor 没有设置默认选择值

Android bindService/远程服务——有什么基本的例子吗?

c# - WatiN 中元素的缓慢迭代

c# - 使用设置和部署以及安装程序类卸载用 c# 编写的应用程序

iPhone 应用程序应进入后台,然后在几分钟不活动后关闭

c# - 这个 ToArray() 实现如何更优化?

c# - 如何从 WinForms 中的文本框移除焦点?