Asp.net mvc异步处理任务

问题描述:

我正在开发具有以下要求之一的asp.net mvc应用程序。Asp.net mvc异步处理任务

场景:用户提交处理长时间运行任务的请求。该任务必须在服务器端启动。在不等待任务完成的情况下,必须向用户发送回复,表示一旦任务完成,他们将收到电子邮件通知。

这似乎是异步处理的场景。最初我想过使用异步委托,但知道异步委托将作为后台线程运行,并且在主线程退出时不会保持活动状态。对我来说,一旦将响应发送给用户,主线程退出等等作为后台线程。纠正我,如果我错了。

所以我想用Thread类创建一个前台线程。但在我读过的其中一篇文章中,提到了asp.net不会考虑它的前景线程与否,并且不会有用。这是真的吗?

我目前正在寻找以下atlernatives。请建议

  1. 走出asp.net之外的任务处理逻辑,放在控制台应用程序/服务 并从asp.net推消息,MSMQ通知应用程序。一旦收到消息,控制台应用程序会做处理,并发送电子邮件通知

  2. WCF服务接收消息并做处理

任何其他更好的想法,请分享

谢谢,

Sveerap

+0

我不知道,但2种解决方案中的任何一种对我来说都很好。 –

你可以简单地使用:

ThreadPool.QueueUserWorkItem(o => 
            { 
             // do something aync 
            }); 

Previous comments on this:

有很多关于饥饿线程请求池论据 这样做(这是真的),但相反的观点是,你应该 饿死池,因为该服务器忙做工作。当然, 理想情况下,您应该完全通过 排队/分布式系统等将工作转移到另一台服务器上,但这是一个复杂的解决方案。除非 您需要处理数百个请求,您不需要考虑 此选项,因为它不太可能会导致问题。它真的是 取决于您的解决方案的可扩展性要求,需要多长时间的后台进程以及调用的频率。

+0

我认为ThreadPool.QueueuserWorkItem创建一个后台线程,并且由于后台线程在主线程完成后不再存在,它会不会在上面的场景中创建问题? – sveerap

+0

不,它肯定不会,它会从线程池中创建一个新线程,请求线程可以终止。 – TheCodeKing

+0

感谢您的回复。但是当线程池线程是后台线程时,我们怎么能说线程不会终止? – sveerap