使用异步执行代码

Mzn*_*Mzn 0 c# async-await c#-5.0

有时,当我运行使用代码所做的异步asyncawait,我发现代码的某些部分甚至没有得到执行.例如,在以下代码中,控制台屏幕上未显示"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();
}
Run Code Online (Sandbox Code Playgroud)

另一个例子是以下,其中不显示Sleeping1或Sleeping2.我不明白这是因为我awaitDoSleepingMain方法中的任务.

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();
}
Run Code Online (Sandbox Code Playgroud)

任何解释(或解释指针)将不胜感激!谢谢

SLa*_*aks 5

你刚刚发现了为什么你永远不应该async void.

如果编写async void方法,则无法知道异步部分何时完成.

这包括Main(); 你的程序一碰到第一个就退出了await.

async方法在控制台程序中大多无用; 如果你真的想尝试它们,你需要调用返回.Wait()Tasks Main().

  • 我同意"async void",但不同意"async"控制台应用程序.虽然我经常使用`AsyncContext`代替`Wait`,但我发现它们很有用. (2认同)