2010-12-10 49 views
3

這可能是由於缺乏對底層操作的理解,或者僅僅是缺乏對線程的理解。當用戶登錄時,我需要運行一些調用Web服務的任務來更新系統中的數據。由於服務可能需要相當長的時間,因此我將整個過程貫穿始終。但是,即使我認爲我在與應用程序分離的線程中運行了整個系列任務,我的應用程序仍會一直等到被調用函數完成後再繼續。ThreadPool.QueueUserWorkItem導致應用程序掛起直至完成

WindowsIdentity identity = WindowsIdentity.GetCurrent(); 
Manager manager = (Manager)Session["Manager"]; 

ThreadPool.QueueUserWorkItem(new SafeWaitCallback().Call(identity, delegate(object noCallBack) 
{ 
    manager.RunAccountUpdater(identity); 
})); 

應用程序掛起,直到函數「RunAccountUpdater」完成併發生回調。我做錯了什麼/不理解?

+3

這裏有任何相關的線程同步代碼嗎?加入?鎖?互斥?任何類似於Control.Invoke?還有什麼可能會阻止? – 2010-12-10 00:37:11

回答

0

經過你實際上有聲明的聲明 - 這將是明顯的。

ThreadPool.QueueUserWorkItem(新 SafeWaitCallback()調用(身份, 委託(對象noCallBack){ manager.RunAccountUpdater(身份); }。));

這發生在內部。

  • 您聲明瞭一個委託。
  • 然後您使用SafeWaitCallback()。調用EXECUTE操作。
  • 然後您將調用的結果排隊到....線程池。

瞧 - 這是你的問題。您必須將調用排隊到委託,而不是執行的結果。

相關問題