非同期待ちのパターンとTask.Run
動作は理解できたと思いました。
しかし、次のコード例でawait
、完了したタスクから戻った後、なぜUIスレッドに同期しないのかと思います。
public async Task InitializeAsync()
{
Console.WriteLine($"Thread: {Thread.CurrentThread.ManagedThreadId}"); // "Thread: 1"
double value = await Task.Run(() =>
{
Console.WriteLine($"Thread: {Thread.CurrentThread.ManagedThreadId}"); // Thread: 6
// Do some CPU expensive stuff
double x = 42;
for (int i = 0; i < 100000000; i++)
{
x += i - Math.PI;
}
return x;
}).ConfigureAwait(true);
Console.WriteLine($"Result: {value}");
Console.WriteLine($"Thread: {Thread.CurrentThread.ManagedThreadId}"); // Thread: 6 - WHY??
}
このコードは、Visual Studio 2019デバッガーが接続されたWindows 10システム上の.NET Framework WPFアプリケーション内で実行されます。
私のApp
クラスのコンストラクターからこのコードを呼び出しています。
public App()
{
this.InitializeAsync().ConfigureAwait(true);
}
多分それが最善の方法ではないかもしれませんが、これが奇妙な行動の理由であるかどうかはわかりません。
コードはUIスレッドから始まり、いくつかのタスクを実行する必要があります。await
操作し、ConfigureAwait(true)
それがメインスレッド(1)に続けるべきタスクが終了した後。しかし、そうではありません。
どうして?