2012-03-13 32 views
0

私はメインGUIアプリケーションを持っています。そのすべてが参照アセンブリ内で実際に動作します。今、私はバックグラウンドワーカーで作業をしないので、基本的にメインUIをロックして処理します。私の参照しているassmblyでは、いくつかのイベントを追加して、さまざまな進捗状況をメインのUIフォームに戻して報告しました。メインのUIフォームで、これらのイベントの値で異なるテキストボックスを更新します。私の質問は、まず第一に、これらのイベントを投げるときに処理が非常に遅くなるようです。だから私はセカンダリスレッド(参照アセンブリから)のイベントを発生させる必要がありますか?参照された(静的な)assmeblyへの私の元の呼び出しは、バックグラウンドワーカーを経由する必要がありますか?別のスレッドでさまざまなタイプの進捗状況を報告したいと思いますが、最適なパフォーマンスを得るためにどのアプローチをとるべきかはわかりません。バックグラウンドワーカーを実装する必要があります

おかげ

答えて

1

あなたの説明から、あなたがマルチスレッドの恩恵を受けるようにそれが応答UIを保つのを助けるだろうとして、それは、聞こえます。

これを行う最も簡単な方法は、BackgroundWorkerを使用することです。 one of the many samplesから作業を開始してから、弾丸を噛んで問題があればここに戻ってください。

コメントへの返信

メインスレッドにBackgroundWorkerのワーカースレッドから通信するための最良の方法は、あなたがパッケージ化するために使用できるオプションのオブジェクトパラメータuserStateを取るBackgroundWorker.ReportProgressメソッドを呼び出すことです通信したいデータ。

これにより、メインスレッドでBackgroundWorker.ProgressChangedイベントが発生し、明示的にInvokeを必要とせずにデータを処理できます。

すでにイベントを実装している場合は、イベントを発生させる代わりにReportProgressにコールするか、イベントを処理するために何らかの種類のアダプタを実装して、ReportProgressメソッド呼び出しにルーティングする必要があります。

+0

ありがとう@ジョー、私はBackgroundWorkerまたはマルチスレッドには問題はありませんが、私は、参照されたアセンブリの職務がBackgroundWorkerを介して開始され、FireworksがBackgroundWorkerのスレッドから起動される静的イベントが発生した場合、呼び出し元のフォームはメインのUIスレッドで受け取るか、バックグラウンドスレッドで受信しますか? – ganders

0

あなたは別のスレッドで、あなたのプロセス(他のアセンブリのメソッド)を起動し、メインフォーム上でそれによって発生するイベントを処理することができます。

UIは別のスレッドによって更新できないため、これらのイベントのコードをthis.Invoke()にラップする必要があります。

例:

private void TheEventRaisedOnAnotherThread(object sender, EventArgs e) 
{ 
    _counter++; 
    this.Invoke(new MethodInvoker(delegate() { TextBox1.Text = _counter.ToString(); })); 
} 
+0

ありがとう@matap、私はちょうど私の "ReferencedAssembly.Go()"メソッドを呼び出すセカンダリスレッドを設定します。 ReferencedAssemblyクラスによって生成されたイベントは、メインUIスレッド経由で受信されます。 セカンダリスレッドaka BackgroundWorker – ganders

+0

新しいスレッドでReferencedAssembly.Goを呼び出すと、そのイベントはメインのUIスレッドではなく新しいスレッドで実行されます。 そのため、this.Invoke()を使用してUIを更新する必要があります。 –

関連する問題