2017-02-10 14 views
3

私はこのようなコンソールアプリケーションをテストした:C#Async/Awaitは割り込みのように動作しますか?

class Program 
{ 
    static void Main(string[] args) 
    { 
     Test(); 

     Console.WriteLine("C"); 

     Console.ReadLine(); 
    } 

    static async void Test() 
    { 
     Console.WriteLine("A"); 
     await Task.Delay(2000); 
     Console.WriteLine("B"); 
    } 
} 

このアプリケーションは、2秒後immmediately次いで、A及びC Bを印刷しました。それはうまく見えます。しかし、私はasync/awaitに関する記事を読んでいます。「スレッドがありません」(http://blog.stephencleary.com/2013/11/there-is-no-thread.html)、async/awaitは追加のスレッドを作成しません。

私のコンソールアプリケーションに戻って、メインスレッドはConsole.ReadLine()にblokcedされているので、Test()(Console.WriteLine( "B"))の残りのコードはConsoleまで実行されません。 ReadLine()が完了しました。しかし実際の結果は異なりますが、残りのコードはメインスレッドのブロックに関係なく実行されます。 (Console.ReadLine(););(Console.WriteLineを(「B」))と中断位置に戻って移動し

は私が命令ポインタが残っているコードに移動させ、CPUの割り込みのような作品を待つことを知りたいです実行後?

+0

async/awaitは非同期作業の抽象です。いくつかのケースでは、実装はCPUインターアクトに基づいており、場合によってはEPOLLに基づいている場合もあり、スレッド同期プリミティブに基づく場合もあります。 – Aron

+1

@KichangKim:[スレッドがありません](http://blog.stephencleary.com/2013/11/there-is-no-thread.html)では、asyncがスレッドを使用しない*方法について説明しています。 I/O操作では一般にスレッドをブロックしません。しかし、非同期メソッド*が*続く場合、どこかで実行する必要があります。私は私の[async intro post](http://blog.stephencleary.com/2012/02/async-and-await.html)でこの動作を説明しています。 –

答えて

6

Windowsフォームアプリケーションとは異なり、コンソールアプリケーションには1つの「blessed」スレッド(UIスレッド)はありません。したがって、synchronization contextはコンソールアプリケーションではデフォルトで使用されていないため、awaitが使用する継続は、実際にはスレッドプールを使用してスケジュールされます。

したがって、現在待機中のスレッドを「中断」する必要はありません。Console.ReadLine - 別のスレッドが代わりに使用されます。

+0

きれいな答えをありがとう! –

関連する問題