4

ASP.NET MVC で次のコードを実行すると、awaitManagedThreadId が変更された場合でも、後でスレッドのカルチャが正しく復元されることがデバッグ ウィンドウで確認できます。

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")ます。しかし、両方の方法を使用しても、結果は同じになるはずです。なぜそれが起こっているのか、それはまったく不明です。

4

3 に答える 3

1

独自の awaiter を作成してawait、別のプール スレッドで発生する場合でも、継続コールバックでカルチャ フローを作成できます。したがって、呼び出しは次のようになります。

await SomeMethod().WithCulture();

Stephen Toub は、PFX チームのブログでこれを行う方法を正確に示していますCultureAwaiter

于 2013-09-24T06:50:47.070 に答える