Michal
Michal

Reputation: 129

Changing CultureInfo of Main thread from worker thread

Is it possible to change CurrentUICulture of main thread when event is raised in worker thread?

Code for 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);

}

Upvotes: 2

Views: 2001

Answers (3)

Henk Holterman
Henk Holterman

Reputation: 273199

Its WinForm client application and it has user settings stored in a database. Worker thread connects database (it takes some time). After successful connection, application should set language according to the user settings.

When your Thread is finished it could use MainForm.Invoke(helperMethod) and then the helperMethod is run on the main thread and can set the Culture safely.

A backgroundworker would make it even easier. It has a Completed event that runs on the main Thread.

Upvotes: 1

arbiter
arbiter

Reputation: 9575

You need to invoke cross-thread callback, if you your application is WinForms app, then you can use ISyncronizedInvoke (it is implemented by any WinForms control).

If not you can use cross-context callback:

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

Upvotes: 0

Jon Skeet
Jon Skeet

Reputation: 1500215

You'd need the worker thread to know about the main thread, so it could do:

mainThread.CurrentUICulture = ...;

However, that strikes me as a fairly dangerous idea... the main thread could be half way through retrieving some resources, for example.

Why not have a method which you can invoke in the main thread (e.g. using Control.Invoke if you're using Windows Forms - the context isn't clear here) which will allow the main thread to change its own culture in a controlled way, reloading resources as necessary etc.

Upvotes: 1

Related Questions