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

时间:2017-08-06 10:03:00

标签: c# .net asynchronous async-await task-parallel-library

我有以下异步代码:

// 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}");

我期望的结果是在await之后有一个不同的线程id,并且新线程id再次具有未修改的系统文化。

这没有发生;线程确实与前一个不同,但文化在某种程度上来自前一个线程。

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

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

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

2 个答案:

答案 0 :(得分:8)

这是.NET 4.6中的预期行为。

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

Here is the official documentation关于这个主题。

特别注意以下内容:

  

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

答案 1 :(得分:1)

对新VS2017控制台项目的快速测试显示此输出(en-GB是我的默认文化):

1:Culture:es
4:Culture:en-GB

你(和我)的期望是什么。也许别的东西正在独立地建立文化?