使用异步执行代码

时间:2013-07-14 11:43:23

标签: 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();
}

另一个例子是以下,其中不显示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();
}

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

1 个答案:

答案 0 :(得分:5)

您刚刚发现了为什么不应该write async void

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

这包括Main();您的程序在点击第一个await时就会退出。

async方法在控制台程序中几乎无用;如果你真的想尝试一下,你需要致电.Wait()Task返回Main()