我可以用await Task.Delay内部具有的异步方法替换对await Task.Delay的调用吗?

时间:2019-01-21 06:57:58

标签: c#

我在async方法中包含以下代码:

// some actions
if (App.pauseCard == true)
{
    vm.Msg1 = "ABC";
    await Task.Delay(500, cts.Token);
    return;
}
// some actions

有人可以告诉我是否可以替换成这个:

// some actions
if (App.pauseCard == true)
{
    SetMessageViewAsync();
    return;
}
// some actions

async方法:

private async void SetMessageViewAsync()
{
   vm.Msg1 = "ABC";
   await Task.Delay(500, cts.Token);
}

1 个答案:

答案 0 :(得分:4)

不,不是。尝试将延迟增加到5000左右-您将清楚地看到第二个代码不再等待。

这是因为async void方法是“即发即弃”的-意味着一旦执行到达第一个实际的await,它就会返回并且该线程在另一个线程正在进行的任务中继续执行-在这种情况下,return是在延迟结束之前执行的。

如果将方法的签名更改为async Taskawait,则代码将等效:

private async Task SetMessageViewAsync()
{
   vm.Msg1 = "ABC";
   await Task.Delay(500, cts.Token);
}

// some actions
if (App.pauseCard == true)
{
    await SetMessageViewAsync();
    return;
}
// some actions