単純なコンソールアプリをこんなふうに書くと、
class Program { static void Main(string[] args) { FuncAsync(); Console.ReadLine(); } static async void FuncAsync() { WriteLine("FuncAsync()Begin"); int r = await Task.Run<int>(() => Worker()); WriteLine("FuncAsync()End"); } static int Worker() { WriteLine("Worker()"); return 99; } static void WriteLine(string msg) { Console.WriteLine(msg + " Thread=" + Thread.CurrentThread.ManagedThreadId); } }
実行結果はこうなる。
FuncAsync()Begin Thread=1 Worker() Thread=3 FuncAsync()End Thread=3
FuncAsync()メソッドが、awaitをはさんで、違うスレッドで実行されます。
まあasync/awaitの仕組みからしてこうなることもわかるのですが、正直ちょっと気持ち悪い感じだぞ。