任务、线程和区域性


每个线程都具有一个关联的区域性和 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();
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值