2013-07-14 124 views
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(); 
} 

任何解釋(或解釋指針)將不勝感激!謝謝

回答

5

你剛剛發現你爲什麼永遠不應該write async void

如果您編寫了async void方法,則無法知道異步部件何時完成。

這包括Main();您的程序一旦遇到第一個await就會退出。

async方法在控制檯程序中基本沒用;如果你真的想嘗試他們,你需要撥打.Wait()Task返回到Main()

+0

也許我應該開始在WinForms或WPF應用程序中嘗試異步。你說的是有道理的。謝謝! – Mzn

+2

我同意重新'異步無效',但不同意重新'異步'控制檯應用程序。我發現它們有用很多次,雖然我通常使用我的'AsyncContext'而不是'Wait'。 –

+1

@StephenCleary:你是對的;異步在並行運行IO綁定操作時非常有用。但是,控制檯應用程序是嘗試異步的錯誤方法。 – SLaks