我正在處理使用ASP.NET成員資格的WPF應用程序中的問題& SQL Anywhere的角色提供程序。該應用使用BackgroundWorker
對象在UI線程背景中執行任務。簡而言之:何時創建線程池?
- 在程序啓動時,該應用程序允許用戶登錄
- 一旦用戶登錄,它會創建一個自定義的
User
類的一個實例。這個類實現了IPrincipal
接口。 - 一旦自定義
User
類的實例被創建,它將被傳遞給AppDomain.SetThreadPrincipal
方法,以便創建的每個新的Thread
都將其用作默認Principal
。 - 後臺任務使用
Thread.CurrentThread.Principal
屬性來確定當前登錄的用戶的名稱並從Role
提供程序檢索用戶的權限。
這種機制已經運行良好3年,但最近發生了一些變化。我們已經升級了許多第三方庫,現在BackgroundWorker
線程正在使用默認的Principal
,它具有空字符串作爲用戶名。這意味着當執行角色檢查並且後臺任務不工作時,不會從數據庫中檢索數據。
所以看起來線程池中的線程正在被創建得比他們以前在最近的升級之前更早。我想知道它們何時創建,以便我可以調查在啓動之前執行用戶登錄過程的可能性。
.NET在什麼時候創建線程池及其內部的線程?
.net線程池是一個靜態訪問,一旦CLR加載進程(mscoree.dll)就加載,它一直是這樣的,實際上這是針對所有機器範圍內的CLR實例。在這種情況下,您可能想調試的問題是當BackgroundWorker訪問Membership API以獲取用戶名時發生的情況,最有可能的問題就是在那裏。您可能需要添加一些日誌記錄來確定訪問Membership API時會發生什麼情況。 – 2014-09-26 13:15:22
線程池在程序啓動時創建。一些池線程在啓動時創建,但其他的則根據需要按需創建。請參閱http://msdn.microsoft.com/en-us/library/system。threading.threadpool(v = vs.110).aspx – 2014-09-26 16:19:00