ASP.NET MVC で次のコードを実行すると、await
ManagedThreadId が変更された場合でも、後でスレッドのカルチャが正しく復元されることがデバッグ ウィンドウで確認できます。
public async Task<ActionResult> Index()
{
Thread.CurrentThread.CurrentUICulture = new CultureInfo("de-DE");
Debug.WriteLine(Thread.CurrentThread.ManagedThreadId);
Debug.WriteLine(Thread.CurrentThread.CurrentUICulture);
await SomeMethod();
Debug.WriteLine(Thread.CurrentThread.ManagedThreadId);
Debug.WriteLine(Thread.CurrentThread.CurrentUICulture);
return View();
}
private async Task SomeMethod()
{
await Task.Delay(100).ConfigureAwait(false);
}
次に、ConfigureAwait(false) を SomeMethod() から Index() に移動します。これを除いて、上記と同じコードです。
public async Task<ActionResult> Index()
{
Thread.CurrentThread.CurrentUICulture = new CultureInfo("de-DE");
Debug.WriteLine(Thread.CurrentThread.ManagedThreadId);
Debug.WriteLine(Thread.CurrentThread.CurrentUICulture);
await SomeMethod().ConfigureAwait(false);
Debug.WriteLine(Thread.CurrentThread.ManagedThreadId);
Debug.WriteLine(Thread.CurrentThread.CurrentUICulture);
return View();
}
private async Task SomeMethod()
{
await Task.Delay(100);
}
現在、文化は復元されませんが、常にに設定されていnew CultureInfo("en-US")
ます。しかし、両方の方法を使用しても、結果は同じになるはずです。なぜそれが起こっているのか、それはまったく不明です。