2012-10-20 61 views
0

我有奇怪的問題報告的用戶和一旦我轉載。Backgroundworker被取消並鎖定?它有可能如何?

我有各種按鈕的形式,每個按鈕執行長時間的操作。

當新按鈕被點擊時,舊的操作將停止,新的將被啓動。

,我注意到奇怪的現象:

當我點擊按鈕,有時操作亙古不變的開始。 操作無法啓動,因爲下面的代碼:

if (!Worker.IsBusy) 
     { 
      RunReload(); 
     } 
     else 
     { 
      isWorkerPendingForNewJob = true; 
      Worker.CancelAsync(); 
     } 

取消被稱爲幾次,但我的工作人員總是很忙!

enter image description here

當我剎車我的項目執行,我注意到它停止在鎖定部分。

在這個鎖裏面,我只是創建了一些用於所有進程的對象。

圖像上的瑕疵點從未命中。 爲什麼backgroundworked總是忙碌並鎖定在這條線上?

enter image description here

+1

聽起來像一個僵局。 「PickOrCreateCategory」全部從哪裏調用? – McGarnagle

+0

只能從此背景工作者運行方法。 – Evgeny

+0

使lockobject至少爲靜態,並使其成爲私有的,以查看它是否在導致死鎖的派生類中使用。 – Silvermind

回答

1

當你調用CancelAsync(),它只是CancellationPending設置標記,以true。您必須定期手動檢查BackgroundWorker工作功能中的該標誌,並自行中斷。你已經這樣做了嗎?

這裏是related MSDN page

此外,您必須確保WorkerSupportsCancellationtrue以支持CancelAsync

+0

由於鎖定被鎖定,無法取消並始終處於忙碌狀態。 – Evgeny

+0

那麼它可能是一個僵局。你應該嘗試找出鎖定'syncCategory'的東西(也許你可以在你鎖定的地方放置斷點(syncCategory)')。 – Benlitz