首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将CurrentCulture设置为任务创建者CurrentCulture执行任务

将CurrentCulture设置为任务创建者CurrentCulture执行任务
EN

Stack Overflow用户
提问于 2014-07-29 09:49:54
回答 3查看 6.8K关注 0票数 6

我有一个使用任务的应用程序。我们还修改了cultureInfo(我们使用EN-US语言,但保留日期/数字格式),并且使用.Net 4.0。

这个应用程序有很多线程和任务,我们有一个工厂来创建task / thread。

对于线程,我们有以下代码,以确保每个线程都以正确的CurrentCulture启动:

代码语言:javascript
复制
//This is basically only the constructor, but it describe well how we create the Thread:
public MonitoredThread(ThreadStart threadStart, string name, bool isBackground = false)
{
    m_threadStart = threadStart;
    m_name = name;
    m_isBackground = isBackground;
    Thread = new Thread(ThreadWorker)
    {
        Name = name,
        IsBackground = isBackground,
        CurrentCulture = CustomCultureInfo.CurrentCulture,
        CurrentUICulture = CustomCultureInfo.CurrentCulture
    };
}

但对于这些任务,我不知道如何实现这种机制:

代码语言:javascript
复制
public static Task ExecuteTask(Action action, string name)
{
    MonitoredTask task = new MonitoredTask(action, name);
    return Task.Factory.StartNew(task.TaskWorker);
}

有什么想法吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-07-29 10:59:29

我不确定你真的需要一个MonitoredTask。可以使用闭包捕获自定义区域性:

代码语言:javascript
复制
public static Task ExecuteTask(Action action, string name)
{
   var customCulture = CustomCultureInfo.CurrentCulture;
   return Task.Factory.StartNew(() => 
   {
       // use customCulture variable as needed
      // inside the generated task.
   });
}

另一种方法是使用适当的重载(无论是object state还是Action<object> ),将当前区域性作为Action<object>传递:

代码语言:javascript
复制
public static Task ExecuteTask(Action action, string name)
{
   var customCulture = CustomCultureInfo.CurrentCulture;
   return Task.Factory.StartNew((obj) => 
   {
       var culture = (CultureInfo) obj;
       // use customCulture variable as needed
      // inside the generated task.
   }, customCulture);
}

我肯定会和前者一起去。

有关闭包的更多信息,请参见.NET中的“闭包”是什么?

票数 5
EN

Stack Overflow用户

发布于 2019-06-18 05:59:40

在.Net 4.5中,您可以为当前应用程序域中的所有线程(MSDN)设置默认区域性:

代码语言:javascript
复制
CultureInfo.DefaultThreadCurrentCulture = culture;
CultureInfo.DefaultThreadCurrentUICulture = culture;

这样,您对应用程序中的所有任务和线程都具有统一的区域性。

票数 2
EN

Stack Overflow用户

发布于 2014-07-29 12:39:24

为了给@Yuval答案添加更多细节,我通常为保留文化性的TaskFactory类创建一些扩展方法(我通常还会添加一个将任何给定属性设置为执行线程的操作:

代码语言:javascript
复制
#region StartNewWithPersistedCulture methods

public static Task<TResult> StartNewWithPersistedCulture<TResult>(
    this TaskFactory taskFactory, Func<TResult> function, CancellationToken cancellationToken = default (CancellationToken), TaskCreationOptions creationOptions = default (TaskCreationOptions))
{
    if (taskFactory == null) throw new ArgumentNullException("taskFactory");
    if (function == null) throw new ArgumentNullException("function");

    var currentCulture = Thread.CurrentThread.CurrentCulture;
    var currentUICulture = Thread.CurrentThread.CurrentUICulture;
    return taskFactory.StartNew(
        () =>
        {
            Thread.CurrentThread.CurrentCulture = currentCulture;
            Thread.CurrentThread.CurrentUICulture = currentUICulture;

            return function();
        }, cancellationToken, creationOptions, TaskScheduler.Default);
}

public static Task StartNewWithPersistedCulture(
    this TaskFactory taskFactory, Action action, CancellationToken cancellationToken = default (CancellationToken), TaskCreationOptions creationOptions = default (TaskCreationOptions))
{
    if (taskFactory == null) throw new ArgumentNullException("taskFactory");
    if (action == null) throw new ArgumentNullException("action");

    var currentCulture = Thread.CurrentThread.CurrentCulture;
    var currentUICulture = Thread.CurrentThread.CurrentUICulture;
    return taskFactory.StartNew(
        () =>
        {
            Thread.CurrentThread.CurrentCulture = currentCulture;
            Thread.CurrentThread.CurrentUICulture = currentUICulture;

            action();
        }, cancellationToken, creationOptions, TaskScheduler.Default);
} 

#endregion
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25012508

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档