【发布时间】:2021-09-25 23:10:31
【问题描述】:
这可能在某处得到解答,但想了解此场景的详细执行情况。今天,我遇到了调用异步方法的 MVC 动作(同步)方法。我不希望此执行同步或异步等待。所以,我没有使用 await 关键字或 wait 方法。但结果让我很惊讶。异步方法被执行了一些部分,一些只是跳过了执行。我已经重现了相同的场景,并且行为也相同。现在,我得到了执行,但想了解为什么这个异步和方法在同步方法中随机执行。我已经粘贴了代码 sn -p 并输出了这段代码。
internal async Task<int> Method1Async()
{
//await Task.Delay(1000);
Console.WriteLine("Inside Method 1 : Before Calling await");
await Task.FromResult(5);
//await Task.Delay(1000);
Console.WriteLine("Inside Method 1 : After Calling await");
return await Task.FromResult(1);
}
internal async Task<int> Method2Async()
{
//await Task.Delay(1000);
Console.WriteLine("Inside Method 2 : Before Calling await");
var res = await Method1Async();
await Task.Delay(1000);
Console.WriteLine("Inside Method 2 : After Calling await");
return res;
}
internal async Task<int> Method3Async()
{
//await Task.Delay(1000);
Console.WriteLine("Inside Method 3 : Before Calling await");
var res = await Method2Async();
await Task.Delay(1000);
Console.WriteLine("Inside Method 3 : After Calling await");
return res;
}
internal void Method4()
{
Method3Async();
}
public static void Main()
{
Console.WriteLine("Inside Main : Before calling Method4");
var demo = new Demo();
demo.Method4();
Console.WriteLine("Inside Main : After calling Method4");
}
【问题讨论】:
-
@mjwills Console.Writeline 方法 2 和 3 的语句未执行。
-
我觉得 CLR 应该负责执行这些剩余的代码部分。
-
您已到达
Main方法的末尾。程序关闭 - 它停止运行。您希望不等待异步代码执行,但还希望控制台被写入。你不能两者兼得。选择一个。 -
如果你错过了,我只在网络应用程序中遇到了这个,然后尝试在控制台应用程序中重现它。
-
我已经检查了这个答案,这一切看起来都像控制台应用程序,感觉很合理,但是对于网络应用程序呢?
标签: c# asp.net-mvc async-await