为什么在ConfigureAwait之后保留文化(false)

use*_*177 6 .net c# asynchronous task-parallel-library async-await

我有以下异步代码:

// Main system culture is English here
Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo("es");

WriteLine($"{Thread.CurrentThread.ManagedThreadId}:Culture:{Thread.CurrentThread.CurrentCulture}");

await Task.Delay(1).ConfigureAwait(false);

WriteLine($"{Thread.CurrentThread.ManagedThreadId}:Culture:{Thread.CurrentThread.CurrentCulture}");
Run Code Online (Sandbox Code Playgroud)

我期望的结果是在等待之后具有不同的线程id并且新的线程id再次具有未修改的系统文化.

这没有发生; 线程确实与前一个不同,但文化以某种方式从前一个线程流出.

为什么保持文化,如果我提出ConfigureAwait我不需要保留SynchronisationContext?我的理解是,文化没有存储在其中,ExecutionContext因此我不确定为什么会发生这种情况.

这是一个控制台应用程序.

完整的示例代码:https://pastebin.com/raw/rE6vZ9Jm

Kir*_*kiy 8

这是.NET 4.6的预期行为.

Julien无法重现它的原因是他可能针对框架的较低版本(例如,在4.5.2中,文化不会流动).

这是关于这个主题的官方文件.

具体请注意以下几点:

...从面向.NET Framework 4.6的应用程序开始,默认情况下,异步操作会继承启动它们的线程的CurrentCulture和CurrentUICulture属性的值.如果当前文化或当前UI文化与系统文化不同,则当前文化跨越线程边界并成为正在执行异步操作的线程池线程的当前文化.