每个线程都具有一个关联的区域性和 UI 区域性,分别由 Thread.CurrentCulture 和 Thread.CurrentUICulture 属性定义。
//通常,除非使用 CultureInfo.DefaultThreadCurrentCulture
// 和CultureInfo.DefaultThreadCurrentUICulture 属性在应用程序域
//中为所有线程指定默认区域性,线程的默
//认区域性和 UI 区域性则由系统区域性定义。 如果你显式设置线程的区域性并启动新线程,则新线程不会继承
//正在调用的线程的区域性;相反,其区域性就是默认系统区域性。 基于任务的应用编程模型遵循这种做法,这
//些应用指定 .NET Framework 4.6 之前的 .NET Framework 版本。
一、 线程的区域性
//获取或设置当前线程的区域性。
public System.Globalization.CultureInfo CurrentCulture { get; set; }
//属性值 CultureInfo 表示当前线程的区域性的对象。
//此属性返回的 @no__t 0 对象及其关联的对象,确定日期、时间、数字、货币值的默认格式、文本的排序顺
//序、大小写约定和字符串比较。
//解区域性名称和标识符、固定、非特定区域性和特定区域性之间的差异,以及区域性信息影响线程和应用
//程序域的方式。
//InvalidOperationException 仅限 .NET Core:不支持从一个线程读取或写入另一个线程的区域性。
二、线程的UI区域性
//线程的 UI 区域性用于查找资源
//UI 区域性指定应用程序支持用户输入和输出所需的资源,默认情况下,它与操作系统区域性相同。
三、示例
下面的示例提供了简单的演示。 它使用 TargetFrameworkAttribute 特性来指定 .NET Framework 4.6,并将应用程序的当前区域性更改为 French (France),或者,如果 French (France) 已为当前区域性,则更改为 English (United States)。 然后,调用一个名为 formatDelegate
的委托,该委托返回在新区域性中格式化为货币值的数字。 注意无论该委托是同步还是异步作为任务,它都将返回预期的结果,因为调用线程的区域性是由异步任务继承的。
using System;
using System.Globalization;
using System.Runtime.Versioning;
using System.Threading;
using System.Threading.Tasks;
//使用 TargetFrameworkAttribute 特性来指定 .NET Framework 4.6
//如果使用的是 Visual Studio,可以省略 TargetFrameworkAttribute 属性,
//并在创建项目时在“新建项目” 对话框中改选“.NET Framework 4.6”作为目标。
//[assembly: TargetFramework(".NETFramework,Version=v4.6")]
public class Example
{
public static void Main()
{
decimal[] values = { 163025412.32m, 18905365.59m };
string formatString = "C2";
Func<String> formatDelegate = () => {
string output = String.Format("Formatting using the {0} culture on thread {1}.\n",
CultureInfo.CurrentCulture.Name,
Thread.CurrentThread.ManagedThreadId);
foreach (var value in values)
output += String.Format("{0} ", value.ToString(formatString));
output += Environment.NewLine;
return output;
};
Console.WriteLine("The example is running on thread {0}",
Thread.CurrentThread.ManagedThreadId);
// Make the current culture different from the system culture.
Console.WriteLine("The current culture is {0}",
CultureInfo.CurrentCulture.Name);
if (CultureInfo.CurrentCulture.Name == "fr-FR")
Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US");
else
Thread.CurrentThread.CurrentCulture = new CultureInfo("fr-FR");
Console.WriteLine("Changed the current culture to {0}.\n",
CultureInfo.CurrentCulture.Name);
// Execute the delegate synchronously.
Console.WriteLine("Executing the delegate synchronously:");
Console.WriteLine(formatDelegate());
// Call an async delegate to format the values using one format string.
Console.WriteLine("Executing a task asynchronously:");
var t1 = Task.Run(formatDelegate);
Console.WriteLine(t1.Result);
Console.WriteLine("Executing a task synchronously:");
var t2 = new Task<String>(formatDelegate);
t2.RunSynchronously();
Console.WriteLine(t2.Result);
Console.ReadLine();
}
}