c# - .net-4.6 中的异步 Thread.CurrentThread.CurrentCulture

标签 c# multithreading asynchronous cultureinfo .net-4.6

由于来自微软的以下信息,我更新了我的代码。听起来他们将当前文化更新为我可以使用的东西。

For apps that target the .NET Framework 4.6 and later versions, CultureInfo.CurrentCulture and CultureInfo.CurrentUICulture are stored in a thread's ExecutionContext, which flows across asynchronous operations. (source: https://msdn.microsoft.com/en-us/library/dn833123(v=vs.110).aspx)

using System;
using System.Globalization;
using System.Threading;
using System.Threading.Tasks;

class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine("start " + Thread.CurrentThread.CurrentCulture.ToString() + " " + Thread.CurrentThread.ManagedThreadId);
        RunAsync().Wait();
        Console.WriteLine("Finish " + Thread.CurrentThread.CurrentCulture.ToString() + " " + Thread.CurrentThread.ManagedThreadId);
        Console.ReadKey();
    }

    static async Task RunAsync()
    {
        Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("de-DE");

        Console.WriteLine("1 " + Thread.CurrentThread.CurrentCulture.ToString() + " " + Thread.CurrentThread.ManagedThreadId);
        string cultureInTask = string.Empty;

        await Task.Run(() => cultureInTask = Thread.CurrentThread.CurrentCulture.ToString() + " " + Thread.CurrentThread.ManagedThreadId).ConfigureAwait(true);

        Console.WriteLine("2 " + cultureInTask);
        string twoA = await TestMethodAsync();
        Console.WriteLine("2a " + twoA + " " + Thread.CurrentThread.ManagedThreadId);
        Console.WriteLine("3 " + Thread.CurrentThread.CurrentCulture.ToString() + " " + Thread.CurrentThread.ManagedThreadId);            
    }

    public static async Task<string> TestMethodAsync()
    {
        Console.WriteLine("2s " + Thread.CurrentThread.CurrentCulture.ToString() + " " + Thread.CurrentThread.ManagedThreadId);
        return await Task.Run(() =>
        {
            return System.Threading.Thread.CurrentThread.CurrentUICulture.ToString() + " " + Thread.CurrentThread.ManagedThreadId;
        });
    }
}

输出:

start en-US 1
1 de-DE 1
2 de-DE 3
2s de-DE 3
2a en-US 4 4
3 de-DE 4
Finish en-US 1

但为什么 2a 返回的是 en-US 而不是 de-DE?是因为executionContext不一样吗?如果是这样,我如何才能保持在相同的执行上下文中?

最佳答案

CurrentCultureCurrentUICulture 是独立的属性。您只设置了 CurrentCulture,并且您在报告 的所有地方都报告了 2a,它报告了 CurrentUICulture。如果您在整个代码中一致地使用相同的属性(任何一个属性都应该没问题),它将为您提供预期的结果。

关于c# - .net-4.6 中的异步 Thread.CurrentThread.CurrentCulture,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44392456/

相关文章:

java - 一旦 JVM 存在,守护线程会发生什么?

javascript - 对 Javascript 中的轻量级开源 AJAX 库的建议

asynchronous - 在 Flutter 中创建异步验证器

javascript - 使用带有 sql server 字段的 c#、javascript 和 HTML 在 <select> 元素中添加项目

c# - 如何通过键盘快捷键打开工具栏菜单?

c# - 如何从二维数组中随机选择一个位置?

asynchronous - 如何在Dart中取消/中止区域?

c# - 如何测试 DataSet 是否为空?

c# - 如何在 WinForms 中等待信号同时监听事件?

java - 线程问题,无法更改外部 TextView 的值