2

バックグラウンドタスクの実行中に、メインフォームのプログレスバーを更新しようとしています。

最新のPatterns&PracticesリリースルートのEventAggregatorを使用して、アプリケーション全体のイベントをルーティングしています。

私は、BackgroundWorkerイベントをリッスンしているクラスからイベントを発生させており、そのようにイベントを発生させています。

  1. bwのプロセスは、進行状況を報告するためにBWメソッドを起動します。
  2. BWは、レポートイベントを発生させます。
  3. それらは、起動前にBWに設定されたSomeCommandクラスメソッドによって取得されます。
  4. EventAggregatorからイベントを公開します

public void ProgressChanged(オブジェクト送信者、ProgressChangedEventArgs ea){KnownProgressStatusChangedEvent evt = KernelKeeper.Kernel.Get()。GetEvent(); evt.Publish(ea); }

私のMainPresenterは、これらのイベントを次のようにサブスクライブしています。

    KnownProgressStatusChangedEvent progressChanged = EventAggregator.GetEvent<KnownProgressStatusChangedEvent>();
    progressChanged.Subscribe(KnownProgressChanged,ThreadOption.UIThread);

ThreadOption.UIThreadを設定しないと、スタックトレースのないProgram.csでTargetInvokationExceptionが発生します。このようにして、例外は発生せず、EventAggregatorにステップインできます。

それがKnownProgressChangedメソッドを呼び出そうとしているとき、それはそれを呼び出そうとし、をチェックしApplication.Current != nullます。nullであり、何も発生しません。

私は何を間違っているのですか?お知らせ下さい。

4

2 に答える 2

2

プログレスバーを処理しているため、ThreadOption.UIThreadを指定する必要があります。新しい進行状況を描画できるようにするには、UIスレッドからハンドラーを呼び出す必要があります。

ただし、WPFを使用している場合は、ThreadOption.UIThreadを使用せずに処理し、自分で呼び出しをディスパッチする必要がある場合は、CompositeWpfEventを確認してください。

イベントアグリゲーター-ユーザーインターフェイススレッドでのサブスクライブを参照してください。

多くの場合、サブスクライバーはイベントに応じてユーザーインターフェイス要素を更新する必要があります。Windows Presentation Foundation(WPF)では、UIスレッドのみがユーザーインターフェイス要素を更新できます。デフォルトでは、サブスクライバーはパブリッシャーのスレッドでイベントを受信するため、パブリッシャーがUIスレッドからイベントを送信すると、サブスクライバーはユーザーインターフェイスを更新できます。

ただし、パブリッシャーのスレッドがバックグラウンドスレッドである場合、サブスクライバーはユーザーインターフェイス要素を直接更新できない場合があります。代わりに、WindowsPresentationFoundationのDispatcherクラスを使用してUIスレッドで更新をスケジュールする必要があります。コンポジットアプリケーションライブラリで提供されるCompositeWpfEventは、サブスクライバーがUIスレッドでイベントを自動的に受信できるようにすることで支援できます。次のコードに示すように、サブスクライバーはサブスクリプション中にこれを示す必要があります。

..。

于 2009-11-19T17:05:06.347 に答える
1

TargetInvocationExceptionは赤いニシンでした。これは、実装されていない例外をコードの他の場所にスローしたために発生しました。

私はWinFormsを使用していて、ThreadOption.PublisherThreadオプションを指定してSubscribeを使用しましたが、これは正常に機能します。

于 2009-11-23T16:13:02.983 に答える