2011-12-30 29 views
3

我已經做了一個asp.net頁面,執行一個很長的sp。 可以說執行sp的函數被稱爲Func1Apppool回收和Asp.net與線程?

香港專業教育學院會見了這個問題:

如果我跑在同一個線程(正常執行)Func1,因爲他看到它作爲一個忙/工作程序池不會回收本身。

但是,如果我在另一個線程執行Func1 - 這樣的應用程序池回收的本身的時間後,它被設置在這裏:

enter image description here

我的問題是:爲什麼是什麼?

是真的,如果我同步運行一個命令,這樣的應用程序是活動的,不符合apppool回收利用? 如果我在一個新線程中創建它,那麼確實符合應用程序池回收的條件嗎?

這是爲什麼?線程是否比主線程不那麼重要?

+0

線程將工作進程內運行的內運行的所有線程 – 2011-12-30 16:55:12

+0

@ChrisS那麼,爲什麼他是回收,當我在一個線程中運行它,當我在正常模式下運行它 - 它不會回收本身? – 2011-12-30 16:58:50

+0

您是否希望工作不需要保持網頁打開狀態?如果是這樣,請嘗試使用緩存的對象與超時選項 – 2011-12-30 17:05:27

回答

4

ASP.NET認爲它正在使用的服務請求線程池中的線程的列表。它知道它可以在沒有線程處於活動狀態時回收應用程序域。

如果你創建一個線程或使用線程池線程沒有ASP.NET的知識,就不會檢測到您的線程是活動的,可以回收利用。

當它回收時,它會卸載AppDomain,導致ThreadAbortException在您的線程上拋出。


您的要求的正常解決方案是有一個由Web應用程序控制的Windows服務。這顯然是在一個單獨的過程中,因此不受Web應用程序回收的影響。但是,這是一個非平凡的練習。

快速和骯髒的解決方案是異步開始從你的web應用程序內的Web請求。然後可以返回開始操作的頁面。被調用的「隱藏」頁面可能會阻塞,直到SP完成。正如我所說的那樣,這是一個令人討厭但簡單的解決方案。

+1

感謝嗨,有沒有可能是asp.net會告訴IIS:**聽我的朋友,約翰創建線程是我的朋友 - 請把它當作的一個線程池線程...並且不回收,如果他正在運行...把他當作線程池線程** – 2011-12-30 17:06:11

+0

我已經爲我的答案添加了兩種可能的解決方案。 – 2011-12-30 17:09:45

+0

請確認(第二種解決方案):我創建了A.aspx,它有一個按鈕,當它按下時,它執行AsyncWebRequest到頁面B.aspx,在他的pageLoad中執行sp。這樣,iis會用線程池處理來自B.aspx的命令 - 它不會回收...正確的? p.s是否意味着在B.aspx執行時不應該關閉A.aspx? – 2011-12-30 17:22:33