2010-04-28 39 views
0

以下是我在一個控制器動作做:爲什麼一個線程在ASP.NET MVC(再次)中被中止?

  1. 創建並啓動一個新的線程,做一個比較長的處理任務(平均約30秒,但可能是幾分鐘)
  2. 立即返回頁面響應,以便用戶知道處理已經開始(簡單地說,具有用於輪詢目的的任務ID的Json)。

在某個隨機點引發ThreadAbortException異常,所以異步任務沒有完成。每次都不會拋出異常,只是隨機發生大約25%的時間。

注意要點:

  • 我沒有打電話或到Response.End Response.Redirect的 - 沒有,即使拋出異常的請求運行
  • 我嘗試使用線程池和我同樣的行爲
  • 我知道ASP.NET運行的線程有幾個注意事項,但我現在不

任何建議在乎嗎?

回答

0

的問題是,該應用程序是被回收。我完全知道,當發生這種情況時,所有線程都會中止,我沒有想到應用程序會回收。原因是使用的異步進程更改了存儲在應用程序根目錄中的臨時文件,並導致了回收。

我覺得啞巴。

2

問題是你不應該這樣做。如果您需要在後臺運行很長一段時間的任務,ASP.Net應該生成一個進程來處理它,或者將工作項添加到隊列中以供Windows服務處理。

+0

對不起Spencer,但我已經說過,我知道這是做異步處理的次優方式,但在我的情況下沒有別的辦法。 – 2010-04-28 16:22:26

+0

不幸的是,它不是簡單的次優。這實際上是錯誤的,並不是爲這種使用而設計的。跟蹤確定如何阻止IIS終止長時間運行的線程的方法很可能會是一種無法預料的後果。如果沒有其他方式,那麼你的環境出現問題。 – 2010-04-28 20:21:56

+0

我同意你的意見。無論如何,我想出了一種方法來產生一個過程,我只需要驗證它的工作。 – 2010-04-29 05:20:37

0

這是否有幫助,因爲你想開火併忘記。

"Delegates provide a method called BeginInvoke that allows us to call the delegate asychronously." 

http://hackingon.net/post/Asynchronous-fire-and-forget-method-calls-in-NET.aspx

+0

我會試一試,但我懷疑這種行爲是一樣的。此外,調用EndInvoke的需求會使事情複雜化,因爲開始調用的原始線程是ASP.NET ThreadPool線程,所以它可能已經被用於服務另一個請求。 – 2010-04-29 05:27:32

0
+0

這將是明顯的選擇,但我似乎無法想象如何以簡單的方式向用戶報告進度。最終,用戶看到頁面長時間「卡住」,這是不可接受的。無論如何,我必須使用AJAX調用,所以我想我會先嚐試Spencer建議的流程解決方案。 – 2010-04-29 05:25:25

相關問題