One of my projects is creating an application framework and this consists of
several libraries with "tools", base UI elements (forms, controls...) and a
"hosting" application. In the near future I will probably dedicate one or more
articles about this hosting application, it's quite interesting. Basically the
hosting application is responsible for "installing" (xcopy), updating and
"running" applications in separate AppDomains.
The problem I encountered was that when a child application (running in its
own AppDomain) used a BackgroundWorker this BackgroundWorker couldn't
synchronize with the main UI thread. This resulted in exceptions whenever the
RunWorkerCompletedEventHandler wanted to update the UI. As a workaround I use
this piece of code before creating the BackgroundWorker.
if (SynchronizationContext.Current ==
null)
{
SynchronizationContext.SetSynchronizationContext(new
WindowsFormsSynchronizationContext());
}
In my framework this is encapsulated in a method on a base Form, this is the
short version:
public void StartAsyncLongAction(
DoWorkEventHandler
action,
ProgressChangedEventHandler progressChanged,
RunWorkerCompletedEventHandler workerCompleted,
string actionText,
string finishedText)
{
if
(SynchronizationContext.Current
== null)
{
SynchronizationContext.SetSynchronizationContext(new
WindowsFormsSynchronizationContext());
}
BackgroundWorker worker = new BackgroundWorker();
worker.DoWork +=
action;
if (workerCompleted != null) { worker.RunWorkerCompleted += workerCompleted;
}
if
(progressChanged != null)
{
worker.WorkerReportsProgress = true;
worker.ProgressChanged += progressChanged;
}
worker.RunWorkerAsync();
}
If somebody knows why this happens I would be very interested.