长期运行的ASP.NET任务

Joh*_*ren 2 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
Run Code Online (Sandbox Code Playgroud)

它允许我使用SQL Server数据库作为工作队列,并使用此查询定期轮询数据库以进行工作.如果工作项目成功完成,我将其标记为已完成并继续,直到没有其他任何操作.我不喜欢的是理论上我可以在任何时候中断,如果我在中间成功并将其标记为已完成,我可能最终会处理相同的工作项两次.我可能有点偏执,这可能都很好,但据我所知,并不能保证不会发生这种情况......

我知道之前有类似的问题,但是非确切的回答是肯定的答案.这是一个非常常见的事情,但ASP.NET托管环境无法处理长时间运行的工作.

请分享你的想法.

Man*_*anu 5

看看NServiceBus

NServiceBus是.NET的开源通信框架,支持发布/订阅和长时间运行的进程.

它是一种基于MSMQ的技术构建,这意味着您的消息不会丢失,因为它们被持久化到磁盘.然而,该框架具有令人印象深刻的性能和直观的API.

  • NServiceBus具有用于实现长时间运行页面的ASP.NET异步页面任务的内置集成,并且在即将到来的版本(2.1)中也支持MVC AsyncController集成.NServiceBus非常支持长期运行的流程,并以可靠和容错的方式促进与这些流程的通信.虽然您*可以*配置WCF也可以这样做,但您需要了解很多关于WCF才能正确使用它,而使用NServiceBus它默认情况下都是这样.WCF没有给你的另一件事是MSMQ的可靠负载平衡 - NServiceBus. (2认同)