如何使用 运行 MVC 完成长时间的 运行 作业而不是等待结果?

How to do long running job and not wait for the result with ASP.NET MVC?

如何使用 ASP.NET MVC 完成长时间的 运行ning 作业而不等待结果? 该工作可以发送数百万封电子邮件、发送推送通知或任何其他我们不关心的长 运行ning job/process,我们只需要知道该过程已启动。

我已经使用 Windows 服务实现了该功能,该服务会定期检查是否有要发送的电子邮件,然后执行发送例程。这在某种程度上很好,因为它与 Web 是分开的,只要有必要就可以继续执行,而且非常可靠。坏处是需要定期检查是否有电子邮件要发送,并且从那个时间间隔加深了用户等待的时间。在推送通知的情况下,如果必须立即接收通知,也许这不是最好的解决方案。

如何在一个用户会话的单独线程中调用方法并确保它被执行并继续 运行 即使用户从站点注销?

您将在此处寻找 async 编程。

Task.Run(() => SomeMethod(someVariable));

此处 SomeMethod 将 运行 异步。

不要将 Web 应用程序的线程用于长时间的 运行 任务,因为线程数量有限,您最终会遇到可伸缩性问题。

这适用于 windows 服务,并将其与创建作业的应用程序分离,使用队列(类似于 msmq、rabbitmq、aws sqs、azure 队列)。而且,如果您说希望更快地处理它们,请将更多消费者放入这些队列中,并且如果您使用的是 aws 或 azure,那么您应该能够根据这些队列编号进行自动扩展。

您可能想要研究使用 SignalR。它是由 ASP.NET 团队设计的,因此很可能非常适合您现有的技能组合。如果可用于构建聊天 windows、多人游戏等内容,或者在您的情况下,监控远程服务器(即 Azure)上发生的长 运行 进程。

http://signalr.net/

https://blog.safaribooksonline.com/2014/02/06/server-side-signalr/