取消并重新激活异步任务

时间:2016-10-14 05:34:17

标签: c# wpf asynchronous

我想创建一个状态栏。应该从类中的任何方法设置状态。如果状态已设置,则应显示5000毫秒。在5000ms之后,状态应为空。有时会发生这种情况,我想在旧状态仍处于活动状态时设置状态。对于这种情况,应该覆盖旧状态并等待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(?)的原因。

1 个答案:

答案 0 :(得分:1)

这就是我要做的。我不知道您在使用async时使用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(); } } 的原因。

function cmp ($a, $b) {
    list($num1, $den1) = explode("/", $a);
    list($num2, $den2) = explode("/", $b);

    $a = ($num1/$den1);
    $b = ($num2/$den2);

    if ($a == $b) {
        return 0;
    }
    return ($a < $b) ? -1 : 1;
}

$classroom = array("4/10","4/2","4/1","4/11","5/2","1/2","5/1","5/10","5/12");

usort($classroom, "cmp");
print_R($classroom);
相关问题