c# - 使用 CurrentCulture 设置为任务创建者 CurrentCulture 执行任务

标签 c# .net multithreading task-parallel-library cultureinfo

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

应用程序有很多线程和任务,我们有一个用于创建任务/线程的工厂。

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

//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
    };
}

但是对于Tasks,我不知道如何实现这种机制:

public static Task ExecuteTask(Action action, string name)
{
    MonitoredTask task = new MonitoredTask(action, name);
    return Task.Factory.StartNew(task.TaskWorker);
}

有什么想法吗?

最佳答案

我不确定您是否真的需要 MonitoredTask为了这。您可以使用闭包捕获自定义文化:

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>Func<object, TResult> ):

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);
}

我肯定会选择前者。

有关关闭的更多信息,请参阅 What are 'closures' in .NET?

关于c# - 使用 CurrentCulture 设置为任务创建者 CurrentCulture 执行任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25012508/

相关文章:

c - 如何使用 PTRACE 获得多线程的一致 View ?

c# - 在同一运行时运行两个相同的 DLL?

c# - 更改后 View 不刷新

c# - 在 WCF 服务中将委托(delegate)人从客户端获取到服务器

asp.net - .NET 的 HTML sanitizer

c# - 将 A 类列表中 B 类对象的属性更改通知 A 类的好方法是什么

Android runOnUiThread 不是异步的

C# 字符串以特定字符结尾为整数

c# - 使用 LINQ 在数组中查找最小和最大日期?

java - Java中的Redis锁键