有时当我使用async
和await
运行异步代码时,我发现代码的某些部分甚至无法执行。例如,在以下代码中,控制台屏幕上未显示“Sleeping2”:
public static void Sleeping(int millis)
{
System.Console.WriteLine("Sleeping1");
System.Threading.Thread.Sleep(millis);
System.Console.WriteLine("Sleeping2");
}
public static async void SleepingAsync(int millis)
{
await System.Threading.Tasks.Task.Run(() => Sleeping(millis));
}
public static async void DoSleepingMain()
{
System.Console.WriteLine("DoSleepingMain1");
SleepingAsync(12000);
System.Console.WriteLine("DoSleepingMain2");
}
public static void Main(string[] args)
{
DoSleepingMain();
}
另一个例子是以下,其中不显示Sleeping1或Sleeping2。我不理解这一点,因为await
方法中的DoSleepingMain
任务。
public static void Sleeping(int millis)
{
System.Console.WriteLine("Sleeping1");
System.Threading.Thread.Sleep(millis);
System.Console.WriteLine("Sleeping2");
}
public static async Task SleepingAsync(int millis)
{
System.Threading.Tasks.Task.Run(() => Sleeping(millis)); //warning: call not awaited
}
public static async void DoSleepingMain()
{
System.Console.WriteLine("DoSleepingMain1");
await SleepingAsync(12000);
System.Console.WriteLine("DoSleepingMain2");
}
public static void Main(string[] args)
{
DoSleepingMain();
}
任何解释(或解释指针)将不胜感激!感谢
答案 0 :(得分:5)
您刚刚发现了为什么不应该write async void
。
如果编写async void
方法,则无法知道异步部分何时完成。
这包括Main()
;您的程序在点击第一个await
时就会退出。
async
方法在控制台程序中几乎无用;如果你真的想尝试一下,你需要致电.Wait()
上Task
返回Main()
。