在工作线程中引发事件时,是否可以更改主线程的CurrentUICulture?
ilustration代码:
static void Main()
{
//do something
Thread workerThread = new Thread(new ThreadStart(DoWork));
workerThread.Start();
//do something
}
void DoWork()
{
ConnectDatabase();
//do some work
ChangeLanguage(lang);
}
void ChangeLanguage(string lang)
{
//this line changes Culture only for worker thread
System.Threading.Thread.CurrentThread.CurrentUICulture = System.Globalization.CultureInfo.CreateSpecificCulture(lang);
}
答案 0 :(得分:1)
你需要工作线程知道主线程,所以它可以这样做:
mainThread.CurrentUICulture = ...;
然而,这让我觉得这是一个相当危险的想法......例如,主要线程可能是检索一些资源的一半。
为什么没有一个可以在主线程中调用的方法(例如,如果你正在使用Windows窗体时使用Control.Invoke
- 这里的上下文不清楚)这将允许主线程改变它自己的以可控的方式培养文化,必要时重新加载资源等。
答案 1 :(得分:1)
它的WinForm客户端应用程序,它具有存储在数据库中的用户设置。工作线程连接数据库(需要一些时间)。连接成功后,应用程序应根据用户设置设置语言。
当你的线程完成后,可以使用MainForm.Invoke(helperMethod)
,然后在主线程上运行helperMethod,并可以安全地设置文化。
backgroundworker会让它更容易。它有一个在主线程上运行的Completed事件。
答案 2 :(得分:0)
你需要调用跨线程回调,如果你的应用程序是WinForms应用程序,那么你可以使用ISyncronizedInvoke(它由任何WinForms控件实现)。
如果没有,您可以使用跨上下文回调:
static void Main()
{
Thread workerThread = new Thread(new ParameterizedThreadStart(DoWork));
workerThread.Start(Thread.CurrentContext);
}
void DoWork(object state)
{
ConnectDatabase();
//do some work
((Context)state).DoCallBack(() => Thread.CurrentThread.CurrentUICulture = ...);
}