2010-07-21 76 views
2

在工作線程中引發事件時是否可以更改主線程的CurrentUICulture?從工作線程改變主線程的CultureInfo

代碼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

您能指出_why_線程是否必須更改主線程的屬性?這聽起來像是一個非常糟糕的設計。也許更好地退後一步,尋找更好的解決方案來解決實際問題。 – 2010-07-21 08:06:47

+0

它的WinForm客戶端應用程序,它具有存儲在數據庫中的用戶設置。工作線程連接數據庫(這需要一些時間)。連接成功後,應用程序應根據用戶設置設置語言。 – Michal 2010-07-21 08:23:35

回答

1

其WinForm的客戶端應用程序,它具有存儲在數據庫中的用戶設置。工作線程連接數據庫(這需要一些時間)。連接成功後,應用程序應根據用戶設置設置語言。

當你的線程完成後,它可以使用MainForm.Invoke(helperMethod),然後helperMethod在主線程上運行,並可以安全地設置文化。

A backgroundworker會使它更容易。它有一個在主線程上運行的Completed事件。

1

你會需要的工作線程知道主線程,因此它可以這樣做:

mainThread.CurrentUICulture = ...; 

然而,在我看來是一個相當危險的想法......例如,主線程可以通過檢索一些資源的一半。

爲什麼沒有可以在主線程中調用的方法(例如,如果您使用的是Windows窗體,則使用Control.Invoke--上下文不清楚),這將允許主線程在必要時重新加載資源等。

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