c# - 需要 : A Windows Service That Executes Jobs from a Job Queue in a DB; Wanted: Example Code

标签 c# .net windows-services sample

需要:

  • 从数据库中的作业队列执行作业的 Windows 服务

通缉:

  • 此类应用程序的示例代码、指南或最佳实践

背景:

  • 用户将单击一个 ashx 链接,该链接会将一行插入到数据库中。
  • 我需要我的 Windows 服务定期轮询此表中的行,它应该为每一行执行一个工作单元。

重点:

  • 这对我来说并不是全新的领域。
    • 编辑:您可以假设我知道如何创建 Windows 服务和基本数据访问。
  • 但我需要从头开始编写此服务。
  • 我只是想提前知道我需要考虑什么。
  • 编辑:我最担心的是失败的工作、工作竞争以及保持服务运行。

最佳答案

鉴于您正在处理数据库队列,由于数据库的事务性质,您已经为您完成了相当多的工作。典型的队列驱动应用程序有一个循环:

while(1) {
 Start transction;
 Dequeue item from queue;
 process item;
 save new state of item;
 commit;
}

如果处理中途崩溃,事务将回滚并在下一次服务启动时处理该项目。

但是在数据库中编写队列实际上比您想象的很多要棘手。如果您部署一种天真的方法,您会发现您的入队和出队相互阻塞并且 ashx 页面变得无响应。接下来你会发现 dequeue 与 dequeue 是死锁的,你的循环不断地遇到错误 1205。我强烈建议你阅读这篇文章 Using Tables as Queues .

您的下一个挑战是让合并率“恰到好处”。过于激进,您的数据库将因池请求而变得炙手可热。太松了,你的队列会在高峰时间增长,而且会排得太慢。您应该考虑使用一种完全不同的方法:使用 SQL Server 内置 QUEUE对象并依赖WAITFOR(RECEIVE)的魔力语义。这允许完全无轮询的自加载调整服务行为。实际上,还有更多:您不需要服务来开始。参见 Asynchronous Procedures Execution有关我在说什么的解释:以完全可靠的方式从 Web 服务调用在 SQL Server 中异步启动处理。最后,如果逻辑必须在 C# 进程中,那么您可以利用 External Activator ,它允许处理托管在独立进程中,而不是 T-SQL 过程。

关于c# - 需要 : A Windows Service That Executes Jobs from a Job Queue in a DB; Wanted: Example Code,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3266420/

相关文章:

c# - Nunit - TestContext.CurrentContext.Test 不工作

c# - 根据两个字段记住密码

visual-studio - 在visual studio中添加服务安装程序和服务进程安装程序

Windows 启动时.net 服务启动超时

windows-services - 如何使用命令行在nssm中设置两个环境变量

c# - 安装 CORS 后无法加载文件

c# - 卸载并重新安装 APK 后 Xamarin Forms "App Not Installed"错误

c# - 如何在 Xamarin.Android 中的小数点分隔符后显示 2 个或 3 个数字?

.net - 如何在源头处理关闭(大 X)按钮?

c# - 将具有类型参数的复杂类型作为 CascadeParameter 传递给子 RenderFragment