【发布时间】:2015-09-10 22:25:51
【问题描述】:
我已经阅读了很多关于使用 C# 进行线程化的文章,但首先我没有在生产中使用它做任何事情。
我有一个应用程序必须处理一堆文件,然后通过电子邮件发送这些文件。这可能需要 60 秒才能完成。我不希望我的网络应用程序的用户必须等待这些事情处理完毕才能转移到网站的其他部分。
单击按钮会调用 SendEmail 函数。我可以对此代码执行什么操作,以便我的用户可以继续浏览网站,而无需中断我需要在 EmailPDFs 函数中执行的处理?
[Authorize]
public ActionResult SendEmail(decimal? id, decimal? id2)
{
EmailPDFs(..., ..., ...);
}
非常感谢!
【问题讨论】:
-
例如,我不会在 Web 应用程序中执行此操作,将作业转储到队列中并让外部服务获取并处理作业。
-
但要计划好如何将成功/失败传达给创建命令的用户。
-
Lloyd,您建议哪种类型的外部服务?感谢劳埃德和马里奥的评论。
-
这样做有什么害处? Task.Factory.StartNew(() => { EmailPDFs(..., ..., ...); });
-
危害是 IIS 可以在任务完成之前关闭您的 AppDomain。 AppDomain 仅在您有活动访问者时保持活动状态,如果没有人访问它不会考虑在拆除域之前运行后台线程(想想在您的程序上执行“结束任务”)。请参阅 this answer of mine 的另一个问题,了解如何要求 IIS 在结束任务任务之前给您最多 90 秒的额外时间来完成后台工作。
标签: c# multithreading