我有一個使用BackgroundWorker執行一系列測試的表單。我使用ProgressChanged事件將消息發送到主線程,然後主線程完成所有更新。我已經梳理了我的代碼,以確保我沒有對後臺工作人員的UI做任何事情。我的代碼中沒有while循環,BackgroundWorker的執行時間有限(以秒或分鐘爲單位)。但是,由於某些原因,當我鎖定我的計算機時,往往會在登錄時掛起應用程序。事情是,BackgroundWorker在發生這種情況時甚至沒有運行。我認爲它與BackgroundWorker相關的原因是因爲只有在加載應用程序後才執行BackgroundWorker(僅在給定特定用戶輸入時才運行),表單纔會掛起。BackgroundWorker可能導致我的應用程序掛起
我通過RunWorkerAsync方法從我的用戶界面中的TreeView中傳遞一個TreeNodes列表,但我只讀取工作線程中的那些節點。我對它們做出的任何修改都是在UI線程中通過progressChanged事件。
我使用了Thread.Sleep在我的工作線程在一定的時間間隔執行測試(涉及超過一個TCP套接字,這是不是在工作線程創建發送消息)。
我,爲什麼我的應用程序可能掛完全不知所措。我確信我在某個地方做了「非法」的事情,我只是不知道該怎麼做。
要縮小問題,註釋掉ProgressChanged處理程序,看看它是否仍然鎖定。如果它仍然鎖定,則保留註釋部分,直到它工作。 – AMissico 2010-06-16 17:24:41
*技術上*,你不應該從BGW中的UI對象中讀取。我建議使用LINQ向BGW線程傳遞'IEnumerable'(或任何您需要的數據,如果不是'string')。 –
2010-06-16 17:35:15
問題是鎖定不容易重現。有時它可能會在幾個小時內不會發生,所以可能需要幾天時間才能縮小這個範圍。使用LINQ而不是RunWorkerAsync的參數將TreeNodes列表傳遞給我的線程有什麼好處? – alexD 2010-06-16 19:39:30