2011-10-10 85 views
0

我是ASP新手,所以這可能是一個基本問題。ASP.net中的多線程最佳方法

我需要寫一個網站thatdo流程如下:

  • 用戶提交請求

  • 的網站說:謝謝你,你會被通知到電子郵件時我會完。

  • 用戶結束會話

  • 網站做的所有長proccess它必須

  • 網站發送電子郵件

是否有可能繼續用戶結束後proccess主要會議?

我讀了一下,我發現異步頁面不會這樣,所以要使用簡單的線程?

實施流程的最佳方式是什麼?

感謝, 薩拉

+0

如果可能的話,我會創建一個Windows服務與實際處理。 – jgauffin

+0

描述「漫長的過程」? – IrishChieftain

回答

2

你可以使用簡單的線程:

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服務的相應方法。

0

我不會去嘗試在網站代碼中運行此路線,而是建立一個單獨的窗口服務,在該框上運行並處理這些請求。當用戶提出他/她的請求時,在某個地方(數據庫?)保存一個標誌,然後從服務中提取並在那裏處理。該服務可以在完成任務時向該人員發送電子郵件。如果您真的想在網站上完成大部分工作,您可以創建一個Web服務並從您的Windows服務中調用該服務。

0

我建議您調用延遲處理的後端服務。您可以創建一個WCF服務,您可以在MsmqBinding上調用該服務。這種服務是一項排隊服務,可以讓您按照您的要求進行操作。它將MSMQ的複雜性抽象出來,並使得實現該服務變得非常簡單。爲了託管您的服務,如果您可以使用AppFabric,那很棒;否則,如果可以的話,在IIS Windows激活服務中託管您的服務。如果這些都不可用,您可以創建自己的Windows服務來託管您編寫的WCF服務 - 這對於以自我託管方式而言稍微複雜一點。

0

由於IIS線程模型,這是不可能的。

您需要創建另一個程序,在後臺處理這些請求。儘管有各種各樣的框架可以做這種事情。也許看看Quartz.NET?

http://quartznet.sourceforge.net/

0

答案真的取決於你正在嘗試做的......在持續的數據坐在...等

我不會在IIS中使用多線程,其他也有建議。風險太大,尤其是風險。在漫長的過程中。你會以「火和忘記」結束。確切的機制?有很多的選擇:

  1. 調用另一個服務(已建議)
  2. 使用一個排隊系統,像MSMQ
  3. 如果工作可以在SQL Server來完成,排隊與SQL Server服務代理(SSSB)

實際的聯繫機制(發送郵件)將由後臺「進程」處理,而不是服務。