我有一個後臺工作人員,通過ReportProgress定期更新GUI。在檢查取消時發送背景人員進入睡眠狀態
更新以定期間隔進行,例如每隔5秒鐘進行一次,或者可能是20秒。爲了在設定的時間執行更新,我會將工作進程發送到睡眠狀態持續一段時間,並在喚醒時使用新信息更新GUI。
工作人員支持取消,並且在睡眠之外它正確取消。
我希望能夠在等待期間調用取消,但是將線程發送到睡眠狀態使得這是不可能的。
我假設我將不得不調用一個循環,並檢查作爲循環模擬線程睡眠的一部分的取消。
什麼是實現這一目標的最佳方法,我的時機完全與我的嘗試。
long counter = 0;
long sleepfor = timelinespeed*1000;
int timelinespeed = 10;
while (counter != sleepfor)
{
Thread.Sleep(1);
counter++;
if (bkgwk.CancellationPending)
{
cancelled = true;
e.Cancel = true;
bkgwk.Dispose();
break;
}
}
+1計時器建議。如果你使用wpf,你也可以看看Dispatcher計時器。取消操作變得簡單 - 您只需停止計時器(假設允許任何當前任務完成即可) – JMarsch 2012-04-23 20:34:58
System.Threading.Timer是否允許我使用信息更新GUI? MSDN建議一個System.Windows.Forms.Timer,但是這是單線程? – Damo 2012-04-23 20:36:57
Forms.Timer和Dispatcher.Timer都在主線程上運行,所以我不會將它們用於繁重的操作。更新每個其他線程的GUI是相同的:使用Dispatcher.Invoke() – 2012-04-23 20:39:22