【问题标题】:ConfigureAwait(true) is working only on 4.6ConfigureAwait(true) 仅适用于 4.6
【发布时间】: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


【解决方案1】:

这是 .NET Framework 4.6 中的一项新功能

见:Task Class (System.Threading.Tasks)

从面向 .NET Framework 4.6 的桌面应用开始,创建和调用任务的线程文化成为线程上下文的一部分。也就是说,无论执行任务的线程的当前文化如何,任务的当前文化都是调用线程的文化。对于面向 .NET Framework 4.6 之前的 .NET Framework 版本的应用,任务的文化是执行任务的线程的文化。有关详细信息,请参阅 CultureInfo 主题中的“文化和基于任务的异步操作”部分。请注意,应用商店应用在设置和获取默认区域性时遵循 Windows 运行时。

因此,新生成的任务与生成的线程具有相同的文化。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-10
    • 2018-08-22
    • 1970-01-01
    相关资源
    最近更新 更多