2008-09-22 59 views
4

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工作流程之外執行很多功能。

例如這一點對於聚合來自幾個第三方服務的數據的應用程序非常重要,對它做些什麼並將其發送回另一個服務。

+1

如果你能在90秒的時間限制內生活,你可以使用QueueBackgroundWorkItem。其他選項包括HangFire,Web Jobs和Azure雲服務。有關更多詳情,請參閱下面的答案。 – RickAndMSFT 2014-06-10 18:59:13

回答

0

一種選擇是讓任務執行一定數量的電子郵件,然後將Response.Redirect重新回到自己並重復,直到發送完所有電子郵件。

1

我能想到的兩種可能的路徑,我低着頭:

  1. 您可以創建一個託管的遠程對象一個窗口服務,讓你的web應用程序調用遠程對象,以確保該方法執行外的IIS進程空間。
  2. 您可以設置要記錄請求的DB或MSMQ。然後,您的網絡應用程序可以監視請求的狀態,隨後通知用戶它已完成。我會設想完成請求的服務。
-3

Server.ScriptTimeout = 360000000;

0

您可以具有將郵件作爲服務運行的功能。向它提交請求,並讓它處理它。每隔一段時間查詢其狀態。如果你有服務器的控制權,你可以安裝一個windows服務,這可能是理想的處理和生命週期管理。

0

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> 
5

這已經討論過的其他問題的一部分:

Multithreading in asp.net

BackgroundWorker thread in ASP.NET

還有就是要做到這一點沒有什麼好辦法。您不需要ASP.NET工作進程中的任何長時間運行的進程,因爲它可能會在您完成之前回收。

編寫Windows服務以在爲您工作的背景中運行。將消息放入MSMQ以啓動任務。然後他們可以運行,只要他們想。

+1

Windows Service如何知道我的業務對象? – Ewerton 2011-08-02 19:11:55

0

當您的網站由共享託管服務提供商託管時,通常無法運行自定義Windows服務。運行一個單獨的線程,讓您進入睡眠狀態以定期運行可能會不一致,因爲IIS往往會不時回收您的線程,甚至在cofig文件或通過代碼設置腳本執行屬性不會確保您的線程不會被殺死和回收。

我遇到了基於緩存過期的方法,該方法給出了共享主機服務上可用的方法可能是最安全的,即最一致的選項。這篇文章解釋得非常好,並提供了一個工作隊列類來幫助管理您在文章結尾處的計劃任務,在此處查看 - http://www.codeproject.com/KB/aspnet/ASPNETService.aspx

1

ASP.NET主機環境對於任何長時間運行的進程都非常危險,消耗CPU或I/O,因爲突然發生AppDomain卸載。

如果您想在請求處理管道之外執行後臺任務,請考慮使用http://hangfire.io,它可以爲您處理後臺處理的所有困難和風險,而無需安裝額外的Windows服務(但可以使用它們,當時間到了)。還有一個mail sending tutorial

相關問題