簡體   English   中英

取消並重新激活異步任務

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM