私はThreadPoolのを使用することをお勧めします。
ThreadPool.QeueuUserWorkItem((_state)=>{ this.OnInstalling(...); });
EDIT:
BackgroundWorkerのは、 "スリム" である代わりにThreadPoolのを使用します。 BackGroundWorkerは、 "マルチスレッドのもの"をすべてカプセル化した "大きな"インスタンスを作成する必要がありますが、内部のBuckgroundWorkerはThreadおよび/またはThreadPoolを使用しています(どちらが覚えていないか)。
スレッドの代わりにThreadPoolを使用すると、(ThreadPoolに送信された)アクションが完了すると、将来、別のアクションにスレッドが再利用されるため、パフォーマンスが向上します。しかし、作成新しいスレッドは、 "高価な"操作、スレッドを再利用する "安い"です。
EDIT 2:
あなたは、多くの場合、「素敵」な方法は、そのための拡張メソッドを使用しているparalelスレッドでイベントを発生させたい場合は:
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); });
}
}
}
さて、このようなBGWを使用すると問題がありますが、MSDNライブラリで説明されているように動作しません。実際にそれを使用することには意味がありません。イベントはすべてtpスレッドで実行されます。同様のスレッドを使用することもできます。 –
「MSDNで記述されているように動作しませんか? – Andy