ASP.net中的多线程最佳方法

问题描述:

我是ASP新手,所以这可能是一个基本问题。ASP.net中的多线程最佳方法

我需要写一个网站thatdo流程如下:

  • 用户提交请求

  • 的网站说:谢谢你,你会被通知到电子邮件时我会完。

  • 用户结束会话

  • 网站做的所有长proccess它必须

  • 网站发送电子邮件

是否有可能继续用户结束后proccess主要会议?

我读了一下,我发现异步页面不会这样,所以要使用简单的线程?

实施流程的最佳方式是什么?

感谢, 萨拉

+0

如果可能的话,我会创建一个Windows服务与实际处理。 – jgauffin

+0

描述“漫长的过程”? – IrishChieftain

你可以使用简单的线程:

protected void BtnProcess_Click(object sender, EventArgs e) 
{ 
    StatusLabel.Text = "Thank you, you will be notified to e-mail when I'll finish"; 
    new Thread(() => 
    { 
     // some processing ... 
    }).Start(); 
} 

这种方法的问题是,IIS可能会在某些情况下,回收你的ASP.NET应用程序。例如,在一段时间不活动(没有用户请求)后,或者如果内存阈值被命中,......这将导致中止长时间运行操作的执行。

由于这个原因,最好在单独的服务中实现这样的长时间运行操作,比如Windows服务。所以你可以例如host a WCF Service inside a Windows Service。该服务将完成所有长时间处理和发送电子邮件。然后从ASP.NET应用程序中,您可以简单地调用此WCF服务的相应方法。

我不会去尝试在网站代码中运行此路线,而是建立一个单独的窗口服务,在该框上运行并处理这些请求。当用户提出他/她的请求时,在某个地方(数据库?)保存一个标志,然后从服务中提取并在那里处理。该服务可以在完成任务时向该人员发送电子邮件。如果您真的想在网站上完成大部分工作,您可以创建一个Web服务并从您的Windows服务中调用该服务。

我建议您调用延迟处理的后端服务。您可以创建一个WCF服务,您可以在MsmqBinding上调用该服务。这种服务是一项排队服务,可以让您按照您的要求进行操作。它将MSMQ的复杂性抽象出来,并使得实现该服务变得非常简单。为了托管您的服务,如果您可以使用AppFabric,那很棒;否则,如果可以的话,在IIS Windows激活服务中托管您的服务。如果这些都不可用,您可以创建自己的Windows服务来托管您编写的WCF服务 - 这对于以自我托管方式而言稍微复杂一点。

由于IIS线程模型,这是不可能的。

您需要创建另一个程序,在后台处理这些请求。尽管有各种各样的框架可以做这种事情。也许看看Quartz.NET?

http://quartznet.sourceforge.net/

答案真的取决于你正在尝试做的......在持续的数据坐在...等

我不会在IIS中使用多线程,其他也有建议。风险太大,尤其是风险。在漫长的过程中。你会以“火和忘记”结束。确切的机制?有很多的选择:

  1. 调用另一个服务(已建议)
  2. 使用一个排队系统,像MSMQ
  3. 如果工作可以在SQL Server来完成,排队与SQL Server服务代理(SSSB)

实际的联系机制(发送邮件)将由后台“进程”处理,而不是服务。