簡體   English   中英

看一下ac#/ ASP.NET線程終止時會發生什么以及如何解決問題

[英]Looking at what happens when a c#/ASP.NET thread is terminated and how to get around problems

我正在一個ASP.NET網站上工作,在一些請求上將運行一個非常冗長的緩存過程。 我想知道如果在代碼處理它的情況下它仍在運行時達到執行超時會發生什么。

特別是我想知道的事情,如果代碼是在try / finally塊的嘗試將最終仍然運行?

另外,我不確定我是否希望緩存終止,即使它繼續,那么長的是有一種產生新線程等的方法,我可以繞過這個執行超時? 我認為立即返回用戶說“正在進行緩存構建”而不是讓它們超時會更好。 我最近開始玩一些鎖定代碼,以確保一次只發生一個緩存構建,但我正在考慮擴展它以使其失去同步。

我並沒有真正使用創建線程,比如我自己,所以我不確定它們是如何工作的,特別是在與ASP.NET交互方面。 例如,如果啟動它的父線程終止將對生成的線程產生任何影響?

我知道這里有很多不同的問題,如果這被認為是最好的,我可以分開它們但是它們似乎都在一起...我會嘗試總結這些問題:

  1. 如果一個線程在try塊中被ASP.NET終止,那么是否仍會執行finally塊
  2. 新創建的線程是否會受到與原始線程相同的超時?
  3. 新創建的線程是否會與創建它們的父線程同時死亡?
  4. 在ASP.NET站點上執行長時間運行后台進程的最佳方法是什么呢?

對於一些非常苛刻的問題我很抱歉,我從來沒有真正玩過線程,他們仍然有點恐嚇我(我的大腦說他們很難 )。 我可以測試很多問題的答案,但我對自己的測試不夠自信。 :)

編輯添加:

回應資本G:

我遇到的問題是ASp.NET執行超時當前設置為一小時,這對我認為的某些進程來說並不總是足夠長。 我已經把一些東西放進了鎖中,以防止不止一個人引發這些長進程,我擔心鎖可能不會被釋放(如果最終阻止並不總是運行,我猜可能會發生)。

你在ASP.NET中沒有運行長進程的注釋是為什么我想把它們移到其他線程而不是阻塞請求線程但是我不知道這是否仍然算作在你所說的ASP.NET架構中運行壞。

代碼實際上不是我的,所以我不被允許(並且不確定我100%理解它)將它重新編寫成服務,盡管這肯定是它最適合居住的地方。

在這種情況下使用BackgroundWorker進程可能需要花費一個小時的時間(對於ASP.NET中長時間運行的進程的注釋)。 然后我會請求返回一個“緩存正在構建”頁面,直到它完成,然后回到正常服務...這有點噩夢,但它的工作,所以我必須找到一種方法來改善它。 :)

  1. 有趣的問題,剛剛測試過,並且不能保證在finally塊中執行代碼,如果線程被中止,它可能會在處理過程中的任何一點停止。 您可以設計一些健全性檢查和其他機制來處理特殊的清理例程等,但它也與您的線程處理有很大關系。

  2. 不一定,這取決於您實現線程的方式。 如果你自己使用線程,那么你可以很容易地進入父線程被殺死的情況,而它的子線程仍處於處理狀態,你通常想在父線程中做一些清理,也就是結束子線程。 有些物品可能會為你做很多事情,所以說這種方式很難。 永遠不要假設這一點。

  3. 不,不一定,不要至少假設這一點,再次與您的設計有關,以及您是自己進行穿線還是使用更高級別的線程對象/模式。 不管怎樣我都不會這么想。

  4. 我建議不要在ASP.NET體系結構中運行長時間的進程,除非它在典型的超時時間內,如果它在10-20秒內沒問題但是如果它是幾分鍾,那么,原因是ASP.NET中的資源使用情況並且它非常糟糕。用戶。 也就是說,您可以執行異步操作,將工作交給服務器,然后在處理完成后返回給用戶(這對於那些10-20s +進程非常有用),可以給用戶一點點動畫或其他方式沒有讓他們的瀏覽器長時間等待服務器上發生的任何事情發生。

如果它是一個長時間運行的進程,需要超過30-60s +的事情,除非由於進程的性質而絕對必須在ASP.NET中完成,我建議將它移動到Windows服務並以某種方式安排它在需要時發生。

注意:線程可能很復雜,並不是很難,因為你必須非常清楚自己在做什么,這需要牢固地了解線程是什么以及它們是如何工作的,我不是專家,但我m也不是全新的,我會告訴你,在大多數情況下你不需要進入線程領域,即使看起來像你做的那樣,但是如果必須的話,我會建議將BackgroundWorker對象作為它們是為了進行批量處理等而簡化的(老實說,對於許多需要線程的情況,這通常是一個非常簡單的解決方案)。

http://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker.aspx

在網頁后面開始漫長或耗時的過程; 它不應該超出ASP.NET執行時間; 應該釋放用戶頁面; 在鎖定等情況下運行請求。所有這些情況都指向使用異步服務。 在我構建的其中一個產品中,使用了針對此類方案的服務。 該服務公開了一些異步方法來啟動。 可以使用其他方法查詢進度狀態。 每個請求都被賦予一些id,並且不會發出任何重復請求。 即使用戶退出,進度也會繼續。 用戶可以稍后查看結果。

如果您已經查看了這些選項,請告訴我是否有任何問題。 或者如果你還沒有朝這個方向看,請按照這種方式進行。 如有任何幫助,請發送您的評論。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM