0

プロジェクトはC#です。

そのため、ライブラリとして実行するように設計されたマルチスレッドコードがたくさんあります。UIとは別のプロジェクトにあります。

私のライブラリには、イベントを発生させるものを作成する前に作成する必要がある中央オブジェクトがあります。

このマスターオブジェクトを一部のオブジェクトに渡して、メインUIスレッドに戻るためにイベントをいつ呼び出す必要があるかをイベントが把握できるようにすることは可能ですか?

彼のイベントハンドラーはほとんどの場合、ランダムなバックグラウンドスレッドから呼び出されるため、UIが大量の呼び出しを行う必要がないようにしたいと思います。

4

3 に答える 3

9

あなたが説明していることから、あなたの最良のオプションは、すべてのオブジェクトがそれらのコンストラクターの引数としてSynchronizationContextを取るようにすることかもしれません。

これを行う場合、イベントを発生させる必要があるときに、SyncrhonizationContext.Postを使用してUIスレッドでイベントを「呼び出す」ことができます。

このように、ライブラリはUIに依存せず(WindowsフォームまたはWPFで機能する可能性があります)、必要に応じてUIスレッドでイベントを発生させることができます。

ライブラリのユーザーは、SynchronizationContext.Currentを使用してオブジェクトを作成するだけです(これにより、WindowsフォームおよびWPFアプリケーションで、どちらへの参照も取得せずに、有効なコンテキストが提供されます)。

于 2009-12-22T01:03:30.220 に答える
0

タイマーを使用するか、イベントに応答すると、UIスレッド(またはスレッド上のデータバインドされたオブジェクト)が「ステータス」オブジェクトをポーリングし、UIが実行する必要のある作業の量を制限できます。

于 2009-12-22T01:02:48.053 に答える
0

ファサードプロキシファクトリーシングルトンのパターンを見たことがありますか?

コアオブジェクトをシングルトンとして実装し、これらを生成してライブラリの呼び出し元に配信するためのプロキシメソッドとファクトリメソッドを提供する場合、これはかなり簡単になります。ファサードパターンは、バックエンドで行われていることの内部のほとんどを抽象化することにより、これを容易にすることができます。

FactoryとSingletonを組み合わせて、公開するすべてのクラスに、メインオブジェクトを必要とするコンストラクターがあることを確認することは、この設計を実施するための良い方法です。私はあなたのライブラリの主な要件/デザインを知らないので、これがあなたのために働くかどうかはわかりません。

于 2009-12-22T01:16:53.237 に答える