如何从父级控制或初始化子线程属性?

时间:2016-07-01 18:21:03

标签: c# multithreading thread-safety

我需要控制新线程的创建,所以它们总是有一些主要的主题。为了做到这一点,我使用了一个ThreadFactory类,我设置了CurrentCulture和CurrentUICulture。

public static class ThreadFactory {
    public static Thread Create(ThreadStart start) {
        var thread = new Thread(start);
        thread.CurrentCulture = CultureInfo.CurrentCulture;
        thread.CurrentUICulture = CultureInfo.CurrentUICulture;
        return thread;
    }
}

例如,如果我想创建一个新线程,它将使用CurrentCulture进行初始化,等于Windows设置,让我们说英语。如果我将主线程更改为西班牙语,新线程仍将是英语。由于这种行为,我总是使用ThreadFactory以这种方式创建新线程:

Thread t1 = ThreadFactory.Create(() => {
    //Thread code
});
t1.start();

执行此操作我确信新线程始终以与主线程相同的文化启动,并且不需要在每个线程代码中更改此线程。 问题是我希望还有一个与CurrentCulture相同的财产。 我尝试使用ThreadStatic属性,但它在子线程中初始化为null值。并且使用它作为静态属性是不可能的,因为我需要它对主线程是线程安全的。

1 个答案:

答案 0 :(得分:0)

我很久以前也有同样的问题,然后我发现了这个问题,你可以把你想要的一切都放在那个帖子里:

private static void CreateThread()
{
  var currentCulture = Thread.CurrentThread.CurrentCulture;
  var currentUICulture = Thread.CurrentThread.CurrentUICulture;
  var thread = new Thread(() =>
  {
    Thread.CurrentThread.CurrentCulture = currentCulture;
    Thread.CurrentThread.CurrentUICulture = currentUICulture;

    // Do something here, example:
    Thread.Sleep(5000);

  }) {IsBackground = true};
  thread.Start();
}