C# .net-4.6中的异步线程.CurrentThread.CurrentCulture

C# .net-4.6中的异步线程.CurrentThread.CurrentCulture,c#,multithreading,asynchronous,cultureinfo,.net-4.6,C#,Multithreading,Asynchronous,Cultureinfo,.net 4.6,由于以下来自microsoft的信息,我对代码进行了一些更新。听起来他们把当前的文化更新成了我可以使用的东西 对于针对.NET Framework 4.6及更高版本的应用程序, 存储CultureInfo.CurrentCulture和CultureInfo.CurrentUICulture 在线程的ExecutionContext中,它在异步 操作。 (来源:) 但为什么我们是恩人而不是德德?是因为executionContext不同吗?如果是这样,我如何保持在相同的执行上下文中?Curren

由于以下来自microsoft的信息,我对代码进行了一些更新。听起来他们把当前的文化更新成了我可以使用的东西

对于针对.NET Framework 4.6及更高版本的应用程序, 存储CultureInfo.CurrentCulture和CultureInfo.CurrentUICulture 在线程的ExecutionContext中,它在异步 操作。 (来源:)


但为什么我们是恩人而不是德德?是因为executionContext不同吗?如果是这样,我如何保持在相同的执行上下文中?

CurrentCulture
CurrentUICulture
是独立的属性。您只设置了
CurrentCulture
,并且在除2a之外的任何地方都报告了它,2a报告了
CurrentUICulture
。如果您在整个代码中始终使用相同的属性(任何一个属性都可以),它将为您提供预期的结果。

您可以链接到您引用的文档吗?我也曾在主要帖子中编辑过,一旦我完成了,我很想把它作为一个拼写错误来结束,但我认为回答这个问题足够有趣……谢谢,这是我测试脚本中的一个拼写错误。然而,我仍然感到困惑,当我传递这行代码时,为什么System.Threading.Thread.CurrentThread.CurrentCulture.IetfLanguageTag会更改为我系统的默认值:using(SqlDataReader rdr=await cmd.ExecuteReaderWithRetryAsync().ConfigureAwait(false))@user1408786:我想知道这是否是
SqlDataReader
中的错误。。。它可能会对当前的文化造成一些混乱,这是相当令人讨厌的…@user1408786:出于兴趣,如果您不调用
configurewait(false)
,会发生什么?我不认为这会有什么不同,因为同步上下文与执行上下文不同,但它可能与此相关……在这种情况下,它保持了正确的区域性。这实际上解决了我的问题。但这意味着我需要检查我所有的code@user1408786:哦,很有趣-很高兴知道。(当我将您的示例代码更改为使用
ConfigureAwait(false)
时,没有任何区别,这很有趣。)
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