【问题标题】:Async Thread.CurrentThread.CurrentCulture in .net-4.6.net-4.6 中的异步 Thread.CurrentThread.CurrentCulture
【发布时间】:2017-06-06 14:14:31
【问题描述】:

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

对于面向 .NET Framework 4.6 及更高版本的应用, CultureInfo.CurrentCulture 和 CultureInfo.CurrentUICulture 被存储 在一个线程的 ExecutionContext 中,它流经异步 操作。 (来源: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不同吗?如果是这样,我怎样才能保持在相同的执行上下文中?

【问题讨论】:

标签: c# multithreading asynchronous cultureinfo .net-4.6


【解决方案1】:

CurrentCultureCurrentUICulture 是独立的属性。您只设置了CurrentCulture,并且您在报告CurrentUICulture 的2a 处除了。如果您在整个代码中始终如一地使用相同的属性(任何一个属性都应该没问题),它会给您预期的结果。

【讨论】:

  • 谢谢,这是我的测试脚本中的错字。但是我仍然很困惑为什么当我通过这行代码时 System.Threading.Thread.CurrentThread.CurrentCulture.IetfLanguageTag 更改为我系统的默认值: using (SqlDataReader rdr = await cmd.ExecuteReaderWithRetryAsync().ConfigureAwait(false))跨度>
  • @user1408786:我想知道这是否是SqlDataReader 中的一个错误......它可能会对当前的文化造成一些混乱,这非常令人讨厌......
  • @user1408786:出于兴趣,如果你不打电话给ConfigureAwait(false)会怎样?我不希望这会有所作为,因为同步上下文与执行上下文不同,但它可能与此有关......
  • 在这种情况下,它会保持正确的文化。所以这实际上解决了我的问题。但这意味着我需要检查我所有的代码
  • @user1408786:哦,很有趣——很高兴知道。 (当我将您的示例代码更改为使用 ConfigureAwait(false) 时,它没有任何区别,这很有趣。)
猜你喜欢
  • 1970-01-01
  • 2011-01-16
  • 2011-10-15
  • 1970-01-01
  • 1970-01-01
  • 2015-07-18
  • 2011-07-26
  • 1970-01-01
  • 2010-10-08
相关资源
最近更新 更多