0

有时,当我使用asyncand运行异步代码时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。我不明白这一点,因为我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();
}

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

4

1 回答 1

5

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

如果您编写一个async void方法,您将无法知道异步部分何时完成。

这包括Main();您的程序一到达第一个await.

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

于 2013-07-14T11:45:14.827 回答