2008-11-11 66 views
5

我在後臺工作線程上運行一系列耗時的操作。在各個階段,我通過調用委託來更新(窗體)進度條。但是,更多時間操作之一發生在一行代碼上。BackgroundWorker線程:更新UI和中止操作

是否有可能:

一個),而正在執行的代碼,單線,或至少顯示一個動畫圖標表示的工作正在做的用戶更新UI。

B)設在執行

回答

2

的代碼一行不幸的是,用戶取消後臺工作線程,可能不會。後臺工作線程需要調用ReportProgress來更新UI線程,並且需要觀察CancellationPending以確定是否應該停止。因此,如果您的工作線程正在單線運行,那麼無法完成此工作。

也許,我誤解了,所以這裏的代碼,模仿什麼,我在得到:

public void DoWork() { 
    System.Threading.Thread.Sleep(10000); 

    // won't execute until the sleep is over 
    bgWorker.ReportProgress(100); 
} 
1

a)您可以通過使用顯示您的形式,而不是一個進度條上的GIF動畫PictureBox控制。您可以在this blog post中找到有關如何執行此操作的詳細信息。

b)在BackgroundWorker的類具有CancelAsync方法,其將向取消當前操作的請求。
這會將BackgroundWorker的CancellationPending屬性設置爲「True」。在您的事件處理程序中,您將不得不定期輪詢該屬性,以便在其值發生更改時採取適當的操作。
還要注意的是這個工作,你必須設置BackgroundWorker的對「真」的WorkerSupportsCancellation財產。

0

你沒有誤解 - 使用ReportProgress或使用委託(像我一樣)基本上達到同樣的目的。它開始在後臺工作之前

1

你的UI代碼可以顯示動畫,如果需要取消的話,可以終止後臺線程。你不會遺憾地利用後臺工作者設計。

1

您可以ReportProgress()方法更新UI(或類屬性)

所以,如果像你的狀態,你的長期運行是固體,反應遲鈍,你怎麼想計算其進展?這顯然是不可能的。
將您的操作儘可能分開,並在每個代碼段後撥打ReportProgress()