2011-07-25 69 views
1

我想完成的工作:我想從asp.net頁面後面的代碼中調用一個長時間運行的業務邏輯方法(在用戶點擊按鈕時)並讓該進程異步運行。該過程具有一些業務對象作爲參數。一旦程序啓動,用戶應該顯示一個屏幕,指示他們將通過電子郵件發送結果;這裏重要的是用戶不必等待過程完成。做這個的最好方式是什麼?該過程已經存在,並在我的項目中運行,但頁面在運行時只是掛起。ASP.NET在後臺執行長時間運行的方法

最初我想過將該方法轉移到Web服務。因爲它需要一個廣泛的參數列表,我將保持簽名相同並傳遞Web服務業務對象,但是我收到命名空間錯誤。特別是「參數類型MyBusinessLogic.MyObject不能分配給參數類型MyWebService.MyObject」,即使我的網站和Web服務引用同一個DLL。我明白爲什麼會發生這種情況,但我需要解決這個問題。

該解決方案的實際實施並不十分關鍵。如果有一些方法可以在ASP.NET中異步運行方法調用,那我真不知道。如果沒有發送和XML參數列表並將其解析爲業務對象,我唯一的選擇用於Web服務?

+0

爲什麼不啓動一個新線程來運行該進程,並返回響應以將用戶重定向到信息頁面? http://msdn.microsoft.com/en-us/library/aa645740(v=vs.71).aspx –

+0

這樣的線程在ASP.Net中是不鼓勵的。正確的過程是使用異步ASP.Net頁面方法。更多信息在這裏:http://msdn.microsoft.com/en-us/library/system.web.ui.pageasynctask。aspx – Jeremy

回答

1

我敢肯定,我終於實現了接近傑里米的方法。

我發現這個網站:http://www.codeproject.com/KB/cs/AsyncMethodInvocation.aspx它解釋瞭如何異步調用方法。總結一下:如果你定義了一個代理並且調用了ProxyMethod.BeginInvoke(null,null),那麼這個方法將在沒有回調的情況下運行,即失敗和遺忘。這就是我真正想要的,所以這就是我要做的。我不知道是否有必要,但是我自己採用了方法,並將其從代碼隱藏轉移到業務邏輯中,並將其變爲靜態方法。因此,代碼如下所示:

private delegate void AsyncReportGen(ReportParameterObject rpo); 
protected void GenerateReport() 
{ 
    //other code 
    AsyncReportGen reportGen = ReportGenClass.GenerateReportStaticMethod; 
    reportGen.BeginInvoke(rdo, null, null); 
} 

GenerateReport方法由按鈕單擊事件調用。 GenerateReportStaticMethod在完成時附帶報告,發出一封電子郵件。由BeginInvoke調用的方法在其自己的線程中運行,以便頁面可以完成加載並向用戶顯示將收到電子郵件的消息。用戶可以繼續使用該網站或關閉瀏覽器。

+0

聽起來不錯。很高興看到你已經整理好了。 – Jeremy

+0

是的。這個過程不應該經常使用,所以我沒有看到它的多線程超載服務器的問題。我想我們會看到。謝謝您的幫助。 – William

1

我有同樣的問題,所以我所做的是將處理調用移至Pre_Render方法,並在處理前端時調用(創建)js函數以更新進度。

Response.Write("fnUpdate('Processing 1 to 30 files')"); 
Response.Flush(); 

我需要更改我的處理邏輯,以便它使用委託來更新進度。

希望它有幫助。

編輯: 不要忘記增加Script.Timeout

Server.ScriptTimeout = 3600; 
+0

處理一旦開始,我不在乎它會發生什麼。我要的只是頁面啓動過程,然後告訴用戶他們將收到一封電子郵件,以便用戶可以繼續他們的一天。我不需要任何形式的狀態更新或任何東西。但感謝您的幫助。 – William

+0

在這種情況下,我會做一個隊列系統。因此,頁面只會將任務添加到隊列中,並有一個將處理隊列的調度程序 – ysrb

+0

您是否碰巧有鏈接到樣本? – William

1
+0

我不確定這是我需要的。如果我這樣做,頁面無法完成加載,直到異步任務完成正確?一旦任務被解僱,我不再關心它。我可以忘記它甚至在運行。 – William

+0

矯枉過正,但可能使用某些消息傳遞服務來告訴其他可執行文件啓動線程並執行任務。這樣做不會將線程添加到IIS工作進程中。如果您閱讀該文章,它將解釋IIS工作進程模式。 – Jeremy

+0

也看看任務並行庫http://msdn.microsoft.com/en-us/library/dd537609.aspx – Jeremy

相關問題