【发布时间】:2015-08-19 14:06:29
【问题描述】:
我在 Dot Net Framework 4.5、4.5.1、4.5.2 和 4.6 上运行了以下代码
public async Task<int> PrintCulturesAsync()
{
Thread.CurrentThread.CurrentUICulture = new CultureInfo("en-IN");
Console.WriteLine(Thread.CurrentThread.ManagedThreadId);
Console.WriteLine(Thread.CurrentThread.CurrentUICulture);
await SomeMethod().ConfigureAwait(true);
Console.WriteLine(Thread.CurrentThread.ManagedThreadId);
Console.WriteLine(Thread.CurrentThread.CurrentUICulture);
return 1;
}
我观察到,只有在 Framework 4.6 上,ConfigureAwait(true) 才能工作并在调用 await SomeMethod().ConfigureAwait(true) 后显示相同的文化。
4.5、4.5.1、4.5.2不支持吗?
【问题讨论】:
-
当你调用这个方法时,当前的同步上下文是什么?另请注意,单个同步上下文完全有可能使用完全不同的线程来处理不同的帖子。有些实现会使用一个线程,有些则不会。
-
对于这个例子,我不关心同步上下文(因为这段代码可以在 Windows、ASP.NET 应用程序中)。由于 msdn 文档指出 ConfigureAwait() 可用于 4.5 和 4.6,因此我感到困惑。但正如 Nitram 指出的“从面向 .NET Framework 4.6 的桌面应用程序开始,创建和调用任务的线程文化成为线程上下文的一部分”,这就是它仅在 4.6 上按预期工作的原因。
标签: c# .net async-await thread-local-storage