在离开网页时线程继续处理

本文关键字:继续 处理 线程 离开 网页 | 更新日期: 2023-09-27 17:59:43

我读过很多关于C#线程的文章,但坦率地说,我在生产中没有使用它做任何事情。

我有一个应用程序,它必须处理一堆文件,然后通过电子邮件发送这些文件。这可能需要60秒才能完成。我不希望我的web应用程序的用户必须等待这些事情的处理才能转移到网站的其他部分。

单击一个按钮,就会调用SendEmail功能。我可以对这个代码做些什么,让我的用户可以继续浏览网站,而不会中断我在EmailPDF功能中需要做的处理?

    [Authorize]
    public ActionResult SendEmail(decimal? id, decimal? id2)
    {
       EmailPDFs(..., ..., ...);  
    }

非常感谢!

在离开网页时线程继续处理

这确实是消息队列设计用来处理的事情。启动一条消息,一个可能独立的服务器上的进程会接收并处理它。完成后,它会将一条消息发送回服务器上的队列,服务器上的一个进程会接收它并通知你它已经完成。然后通知用户工作已完成。

现代消息队列系统可以由数据库(如Mongo、MySql或SQL Server)支持,并且非常健壮。它们的伟大之处在于,它们允许您将长时间运行或CPU密集型进程转移到其他服务器上,这样您的网站就可以保持良好和快速。

您可以尝试通过使用TaskFactory和所有其他东西(对许多人来说,这是他们所走的路线),将多线程和并行性添加到您的web应用程序中,但如果需要,分离应用程序并在必要时将这些占用资源的大部件分解并不是很容易。

我敦促您考虑基于队列的解决方案。


更新:

有关如何实现此类解决方案的示例和信息,请参阅以下内容:

  • MSDN上MSMQ和.NET的可靠消息
  • C#:MSDN上的消息队列服务应用程序

此外,考虑一下这个StackOverflow问题,了解一下所需最少代码量的快速速成课程。

最后一点注意:MSMQ内置于某些风格的Windows中,可以通过控制面板的"添加/删除程序"功能添加到其中。但是,如何安装它将取决于您的特定风格和Windows版本。简单的谷歌搜索将帮助您找到合适的说明。

祝你好运!