asp.net - 长时间运行的 ASP.NET 任务

标签 asp.net asynchronous long-running-processes

我知道有很多 API 可以执行此操作,但我也知道托管环境(即 ASP.NET)对您可以在单独的线程中可靠地执行的操作施加了限制。

我可能完全错了,所以如果我错了,请纠正我,但这是我认为我知道的。

  • 请求通常会在 120 秒后超时(这是可配置的),但 ASP.NET 运行时最终会终止完成时间过长的请求。
  • 托管环境(通常是 IIS)采用进程回收,并且可以随时决定回收您的应用。发生这种情况时,所有线程都会中止,应用程序会重新启动。然而,我不确定它有多激进,假设它会中止一个正常的正在进行的 HTTP 请求是有点愚蠢,但我希望它中止一个线程,因为它对 单元一无所知一个线程的工作

如果您必须创建一个编程模型,该模型在理论上可以轻松、可靠地放置一个长时间运行的任务,该任务必须运行数天,您将如何在 ASP.NET 应用程序中完成此任务?

以下是我对这个问题的看法:

我一直在考虑在 win32 服务中托管 WCF 服务。并通过 WCF 与服务对话。然而,这不是很实用,因为我选择这样做的唯一原因是从几个不同的网络应用程序发送任务(工作单元)。然后我最终会向服务请求状态更新并采取相应行动。我对此最担心的是,如果我必须将每个任务部署到服务才能执行某些指令,那将不是特别好的体验。还有这个输入问题,如果我有一个大数据集并且需要仔细研究它,我将如何为该服务提供数据?

我现在通常做的是这个

SELECT TOP 10 * 
FROM WorkItem WITH (ROWLOCK, UPDLOCK, READPAST)
WHERE WorkCompleted IS NULL

它允许我将 SQL Server 数据库用作工作队列,并使用此查询定期轮询数据库以查找工作。如果工作项成功完成,我将其标记为已完成并继续,直到无事可做。我不喜欢的是,理论上我可能会在任何时候被打断,如果我处于成功和将其标记为已完成之间,我最终可能会处理同一个工作项目两次。我可能有点偏执,这可能没问题,但据我了解,不能保证不会发生这种情况......

我知道之前在 SO 上也有过类似的问题,但没有真正给出明确的答案。这是很常见的事情,但 ASP.NET 托管环境不足以处理长时间运行的工作。

请分享您的想法。

最佳答案

看看NServiceBus

NServiceBus is an open source communications framework for .NET with build in support for publish/subscribe and long-running processes.

这是一项基于 MSMQ 的技术,这意味着您的消息不会丢失,因为它们会持久保存在磁盘上。然而,该框架具有令人印象深刻的性能和直观的 API。

关于asp.net - 长时间运行的 ASP.NET 任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2519756/

相关文章:

javascript - 访问 Node js 模块中的变量

transactions - SAGA代表什么?

c# - 如何在 ASP.NET Core 1.0 中为 Web 应用程序显示 LoggerFactory 日志控制台?

asp.net - 如何在IIS 7中将应用程序添加到“默认网站”?

c# - System.Exception : Incorrect syntax I can't find the problem

asp.net - 可以与 ASP.NET 应用程序的构建集成的 JavaScript 压缩器

c# - 在使用 BeginInvoke 和 EndInvoke 时如何避免传递/存储委托(delegate)?

javascript - Node.js 中的异步递归问题

c# - ASP.NET Core 应用程序中每个用户一个长时间运行的进程

sql-server - SQL Server 长时间运行的查询需要数小时但使用低 CPU