asp.net进程中的长时间运行的代码
E.g.我们这段代码在asp.net窗体codebihind:asp.net进程中的长时间运行的代码
private void btnSendEmails_OnClick()
{
Send100000EmailsAndWaitForReplies();
}
此代码执行将被超时原因杀死。 为了解决这个问题,我想看到这样的事情:
private void btnSendEmails_OnClick()
{
var taskId = AsyncTask.Run(() => Send100000EmailsAndWaitForReplies());
// Store taskId for future task execution status checking.
}
这种方法将一些方法W3wp.exe进程之外的特殊enveronment内执行。
有没有人知道解决这类问题的框架/工具集?
更新:电子邮件发送方法只是我的意思的一个例子。事实上,我可能需要在asp.net工作流程之外执行很多功能。
例如这一点对于聚合来自几个第三方服务的数据的应用程序非常重要,对它做些什么并将其发送回另一个服务。
- QueueBackgroundWorkItem我的示例显示发送电子邮件。
- HangFire开源项目在共享主机上工作。
- 在Azure上,您可以使用WebJobs。
- 在Azure上,Cloud services
一种选择是让任务执行一定数量的电子邮件,然后将Response.Redirect重新回到自己并重复,直到发送完所有电子邮件。
我能想到的两种可能的路径,我低着头:
- 您可以创建一个托管的远程对象一个窗口服务,让你的web应用程序调用远程对象,以确保该方法执行外的IIS进程空间。
- 您可以设置要记录请求的DB或MSMQ。然后,您的网络应用程序可以监视请求的状态,随后通知用户它已完成。我会设想完成请求的服务。
Server.ScriptTimeout = 360000000;
您可以具有将邮件作为服务运行的功能。向它提交请求,并让它处理它。每隔一段时间查询其状态。如果你有服务器的控制权,你可以安装一个windows服务,这可能是理想的处理和生命周期管理。
ASP.NET 2.0+支持异步页面的概念。将页面指令Async =“true”添加到您的页面。
然后在Page_Load中,使用BeginEventHandler和EndEventHandler委托在相应的“处理程序”中异步执行代码。
<%@ Page Language="C#" Async="true" %>
<script runat="server">
protected void Page_Load(object sender, EventArgs e)
{
BeginEventHandler begin = new BeginEventHandler(BeginMethod);
EndEventHandler end = new EndEventHandler(EndMethod);
AddOnPreRenderCompleteAsync(begin, end);
}
</script>
这已经讨论过的其他问题的一部分:
BackgroundWorker thread in ASP.NET
还有就是要做到这一点没有什么好办法。您不需要ASP.NET工作进程中的任何长时间运行的进程,因为它可能会在您完成之前回收。
编写Windows服务以在为您工作的背景中运行。将消息放入MSMQ以启动任务。然后他们可以运行,只要他们想。
Windows Service如何知道我的业务对象? – Ewerton 2011-08-02 19:11:55
当您的网站由共享托管服务提供商托管时,通常无法运行自定义Windows服务。运行一个单独的线程,让您进入睡眠状态以定期运行可能会不一致,因为IIS往往会不时回收您的线程,甚至在cofig文件或通过代码设置脚本执行属性不会确保您的线程不会被杀死和回收。
我遇到了基于缓存过期的方法,该方法给出了共享主机服务上可用的方法可能是最安全的,即最一致的选项。这篇文章解释得非常好,并提供了一个工作队列类来帮助管理您在文章结尾处的计划任务,在此处查看 - http://www.codeproject.com/KB/aspnet/ASPNETService.aspx
ASP.NET主机环境对于任何长时间运行的进程都非常危险,消耗CPU或I/O,因为突然发生AppDomain卸载。
如果您想在请求处理管道之外执行后台任务,请考虑使用http://hangfire.io,它可以为您处理后台处理的所有困难和风险,而无需安装额外的Windows服务(但可以使用它们,当时间到了)。还有一个mail sending tutorial。
如果你能在90秒的时间限制内生活,你可以使用QueueBackgroundWorkItem。其他选项包括HangFire,Web Jobs和Azure云服务。有关更多详情,请参阅下面的答案。 – RickAndMSFT 2014-06-10 18:59:13