0
有時當我使用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();
}
任何解釋(或解釋指針)將不勝感激!謝謝
也許我應該開始在WinForms或WPF應用程序中嘗試異步。你說的是有道理的。謝謝! – Mzn
我同意重新'異步無效',但不同意重新'異步'控制檯應用程序。我發現它們有用很多次,雖然我通常使用我的'AsyncContext'而不是'Wait'。 –
@StephenCleary:你是對的;異步在並行運行IO綁定操作時非常有用。但是,控制檯應用程序是嘗試異步的錯誤方法。 – SLaks