Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 我是否可以用一个异步方法替换对wait Task.Delay的调用,该方法在wait Task.Delay中具有?_C# - Fatal编程技术网

C# 我是否可以用一个异步方法替换对wait Task.Delay的调用,该方法在wait Task.Delay中具有?

C# 我是否可以用一个异步方法替换对wait Task.Delay的调用,该方法在wait Task.Delay中具有?,c#,C#,我有一个async方法中的代码: // some actions if (App.pauseCard == true) { vm.Msg1 = "ABC"; await Task.Delay(500, cts.Token); return; } // some actions private async void SetMessageViewAsync() { vm.Msg1 = "ABC"; await Task.Delay(500, cts.Token)

我有一个
async
方法中的代码:

// some actions
if (App.pauseCard == true)
{
    vm.Msg1 = "ABC";
    await Task.Delay(500, cts.Token);
    return;
}
// some actions
private async void SetMessageViewAsync()
{
   vm.Msg1 = "ABC";
   await Task.Delay(500, cts.Token);
}
有人能告诉我是否可以用以下内容替换:

// some actions
if (App.pauseCard == true)
{
    SetMessageViewAsync();
    return;
}
// some actions
这个
async
方法:

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

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

这是因为
async void
方法是“fire and forget”-这意味着一旦执行到达第一个实际的
wait
,它就会返回,并且当任务在另一个线程上进行时线程会继续执行-在这种情况下,
return
会在延迟结束之前执行

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

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

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

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

这是因为
async void
方法是“fire and forget”-这意味着一旦执行到达第一个实际的
wait
,它就会返回,并且当任务在另一个线程上进行时线程会继续执行-在这种情况下,
return
会在延迟结束之前执行

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

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

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