[英]Cancel and reactivate async task
我想創建一個狀態欄。 應該從類內的任何方法設置狀態。 如果設置了狀態,它應該是可見的 5000 毫秒。 5000 毫秒后,狀態應為空。 有時可能會發生,我想在舊狀態仍處於活動狀態時設置狀態。 對於這種情況,舊的狀態應該被覆蓋並等待 Task.Delay(5000); 應重置並從 0 開始計數。
我當前的代碼如下所示:
public CancellationTokenSource tokenSource { get; set; }
public CancellationToken token { get; set; }
public async Task SetStatusMessage(string pStatusMessage)
{
tokenSource.Cancel();
await Task.Run(async () =>
{
if (token.IsCancellationRequested)
{
token.ThrowIfCancellationRequested();
}
this.Dispatcher.Invoke(() =>
{
this.txtStatusMessage.Text = pStatusMessage;
});
await Task.Delay(5000, token);
this.Dispatcher.Invoke(() =>
{
this.txtStatusMessage.Text = "";
});
}, token);
public async void AnyMethod()
{
await this.SetStatusMessage("Hello World");
}
這不起作用,因為我在運行之前取消了任務。 這就是為什么我得到OperationCanceledException
(?) 的原因。
這就是我要做的。 我不知道你為什么在使用async
時使用Task.Run()
。
public async Task SetStatusMessage(string pStatusMessage)
{
CancellationTokenSource localToken;
try
{
if (tokenSource != null)
tokenSource.Cancel();
tokenSource = new CancellationTokenSource();
localToken = this.tokenSource;
this.txtStatusMessage.Text = pStatusMessage;
await Task.Delay(5000, localToken.token);
this.txtStatusMessage.Text = "";
}
catch (TaskCanceledException) {}
finally
{
localToken.Dispose();
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.