在下面的代碼中,如果該UserCancelled屬性設定為 true,我希望它立即結束回圈并繼續代碼。
我面臨的問題是它在 6 秒過去后繼續,而不是之前,我認為取消令牌會提前結束延遲。
有哪些選項可以盡快結束這種延遲?
CancellationTokenSource _source = new CancellationTokenSource();
var token = _source.Token;
foreach (var mock in lst)
{
if (UserCancelled)
{
_source.Cancel();
_source.Dispose();
break;
}
label1.Text = mock.Name;
await Task.Delay(6000, token);
}
label1.Text = " Broke Out";
uj5u.com熱心網友回復:
這是因為在等待 6 秒后執行 continue 后才請求取消。將取消源提取到一個欄位中,并_source.Cancel()在您設定UserCancelled為 true 時呼叫。
label1給我提示這是某種 UI 代碼,所以我會像這樣重構它:
// this is a field
private CancellationTokenSource _source = new CancellationTokenSource();
// call this from whatever handler/command and pass _source.Token to it:
private async Task DoMyTaskAsync(CancellationToken token)
{
foreach (var mock in lst)
{
if (token.IsCancellationRequested)
break;
label1.Text = mock.Name;
await Task.Delay(6000, token);
}
label1.Text = " Broke Out";
}
// can be a simple event handler, too (eg. for some btnCancel.Click)
private void OnCancelCommand()
{
// avoid double cancellation and ObjectDisposedException
if (UserCancelled)
return;
_source.Cancel();
_source.Dispose();
UserCancelled = true;
}
uj5u.com熱心網友回復:
如果在我們進入回圈時UserCancelled已經設定為,那么您應該立即取消。true
如果UserCancelled是false在初始檢查,那么你去Task.Delay并開始等待。在等待期間不執行任何其他檢查。
60 秒后作業恢復,然后您繼續回圈的下一次迭代。在這里,再次,如果 fUserCancelled設定為true,您將取消并退出,否則將再等待 60 秒。
這里最好的解決方案是使_source變數可用于代碼,即設定UserCancelled. 而這樣的代碼會_source.Cancel()直接呼叫。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/429171.html
