Рекомендую использовать ThreadPool:
ThreadPool.QeueuUserWorkItem((_state)=>{ this.OnInstalling( ... ); });
EDIT:
Использование ThreadPool вместо BackgroundWorker "тоньше". BackGroundWorker должен создавать «большой» экземпляр, инкапсулирующий все «многопоточность», но BuckgroundWorker во внутренних компонентах использует Thread и / или ThreadPool (я не помню, какой именно).
Использование ThreadPool вместо Thread лучше для производительности, потому что когда действие (отправленное в ThreadPool) выполнено, поток повторно используется для других действий в будущем. Но создание нового потока - «дорогая» операция, повторное использование потока - «дешевый».
РЕДАКТИРОВАТЬ 2:
Если вы хотите поднять событие в параллельном потоке, часто «хороший» способ - использовать для этого методы расширения:
class Product {
public void Install() {
this.OnInstalling( ... );
...
this.OnInstalled( ... );
}
public void InstallAsync() {
this.OnInstallingAsync( ... );
...
this.OnInstalledAsync( ... );
}
protected virtual void OnInstalling( InstallProgressChangedEventArgs e ) {
this.Installing.Raise(this, e);
}
protected virtual void OnInstallingAsync( InstallProgressChangedEventArgs e ) {
this.Installing.RaiseAsync(this, e);
}
public event EventHandler<InstallProgressChangedEventArgs> Installing;
protected virtual void OnInstalled( InstallCompletedEventArgs e ) {
this.Installed.Raise(this, e);
}
protected virtual void OnInstalledAsync( InstallCompletedEventArgs e ) {
this.Installed.RaiseAsync(this, e);
}
public event EventHandler<InstallCompletedEventArgs> Installed;
}
// ...
public static class EventExtensions {
public static void Raise( this EventHandler handler, object sender, EventArgs e ) {
if (null != handler) { handler(sender, e); }
}
public static void Raise<TEventArgs>( this EventHandler<TEventArgs> handler, object sender, TEventArgs e ) where TEventArgs : EventArgs {
if (null != handler) { handler(sender, e); }
}
public static void RaiseAsync( this EventHandler handler, object sender, EventArgs e ) {
if (null != handler) {
ThreadPool.QeueuUserWorkItem((_state)=>{ handler(sender, e); });
}
}
public static void RaiseAsync<TEventArgs>( this EventHandler<TEventArgs> handler, object sender, TEventArgs e ) where TEventArgs : EventArgs {
if (null != handler) {
ThreadPool.QeueuUserWorkItem((_state)=>{ handler(sender, e); });
}
}
}