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

我有以下异步代码
// 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}");

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

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

如果我建议使用ConfigureAwait,我不需要保留SynchronisationContext,为什么要保持文化?我的理解是文化没有存储在ExecutionContext上,因此我不确定为什么会这样.

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

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

解决方法

这是.NET 4.6的预期行为.

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

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

具体请注意以下几点:

… starting with apps that target the .NET Framework 4.6,asynchronous operations by default inherit the values of the CurrentCulture and CurrentUICulture properties of the thread from which they are launched. If the current culture or current UI culture differs from the system culture,the current culture crosses thread boundaries and becomes the current culture of the thread pool thread that is executing an asynchronous operation.

相关文章

在项目中使用SharpZipLib压缩文件夹的时候,遇到如果目录较深,则压缩包中的文件夹同样比较深的问题。比...
项目需要,几十万张照片需要计算出每个照片的特征值(调用C++编写的DLL)。 业务流程:选择照片...
var array = new byte[4]; var i = Encoding.UTF8.GetBytes(100.ToString("x2"));//...
其实很简单,因为Combox的Item是一个K/V的object,那么就可以把它的items转换成IEnumerable<Dic...
把.net4.6安装包打包进安装程序。 关键脚本如下: 头部引用字符串对比库 !include "WordFunc....
项目需求(Winform)可以批量打印某个模板,经过百度和摸索,使用iTextSharp+ZXing.NetʿreeSp...