2

私は下の人生で何かを達成したい -

ここに画像の説明を入力

私のアプリケーションはUIモジュールを開始し、UIモジュールからコアモジュールを開始します。コア モジュールは、別のスレッドで引き続き実行されます。コア モジュールの特定のアクションで、UI モジュールによってサブスクライブされるイベントを発生させたいと考えています。

基本的に、特定の列挙型情報を UI モジュールに送信したいと考えています。

そのためのモデルを提案してください。私はそれを達成しようとしています。

このモデルでは、両方のモジュールがブロックされた状態で実行されますか?

前もって感謝します

4

4 に答える 4

1

BackgroundWorkerクラスの使用をお勧めします

このチュートリアルをチェックしてください http://www.dotnetperls.com/backgroundworker

クラスリファレンス http://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker.aspx

ここでそれが簡単な方法でどのように進むか:

  1. UIフォームを開きます(デザインビュー)
  2. UIフォームにbackgroundworkerコントロールを追加します
  3. プロパティペインを開き、イベントに切り替えます(稲妻アイコン)
  4. doworkおよびrunworkercompletedイベントをダブルクリックします(これによりイベントハンドラーが生成されます)
  5. イベントハンドラーに移動します(コード内)
  6. 次に、doworkハンドラーで処理コードを記述し、送信する結果を次のようにuiモジュールに追加します。e.Result= your_enum(またはその他のオブジェクト);
  7. 次に、runworkercompletedハンドラーに移動し、RunWorkerCompletedEventArgs e(RunWorkerCompletedEventArgsオブジェクト)を列挙型(またはdoworkハンドラーから返されたオブジェクト)に型キャストし、必要に応じてUIで使用します。
  8. 最後に、UI mdouleからbackgroundworker:backgroundWorker1.RunWorkerAsync()を開始することを忘れないでください

備考:進捗状況を定期的に報告する必要がある場合は、BackgroundWorkerクラスのReportProgressメソッドを使用してください。このメソッドには2つのオーバーロードがあります:1)http://msdn.microsoft.com/en-us/library/ka89zff4.aspx 2)http://msdn.microsoft.com/en-us/library/a3zbdb1t.aspx

1つ目は進捗率のみを報告でき、2つ目は任意のオブジェクトを渡すために使用できます。

于 2013-02-06T18:33:52.647 に答える
1

これを正確に行うには、インターフェイスでProgressクラスを使用できます。IProgress

  1. UIコンテキストProgressで、渡す必要のあるデータのジェネリック引数を使用してオブジェクトを作成します。

  2. そのイベントを購読して、バックグラウンドタスクが更新したときにやりたいことを何でもします。

  3. バックグラウンドタスクにIProgressProgress実装する)タイプのオブジェクトを受け入れさせReport、関連するデータを定期的に使用させます。

イベントは呼び出されるProgressChangedたびに発生し、オブジェクトはそれが作成された場所の現在の同期コンテキストをキャプチャします。これは、イベントがUIスレッドで発生することを示すための凝った方法です。ReportProgress

于 2013-02-06T17:25:48.863 に答える
0

私には Mediator パターンの古典的な使い方のように思えます。Mediator は、切断されたコンポーネントが互いに通信できるようにします。

私はたまたま、自分の MVVM フレームワークにこれのコピーを持っています。これは、ここから取得できます。

http://cinch.codeplex.com/SourceControl/changeset/view/70832#796984

これもつかむ

http://cinch.codeplex.com/SourceControl/changeset/view/70832#797008

私の実装では、WeakReference を使用してそれを行うことができるため、強い参照は保持されません。また、サブスクライバーが属性を使用して特定のイベントをリッスンするメソッドを接続し、パブリッシャーが T の新しいメッセージをブロードキャストすることもできます。

パブリッシャー/サブスクライバーはメディエーターに登録するだけです

//done by both subscriber and publisher
Mediator.Instance.Register(this);


//Subscriber
[MediatorMessageSinkAttribute("DoBackgroundCheck")]
void OnBackgroundCheck(string someValue) { ... }


//publisher might typically do this
mediator.NotifyColleagues("DoBackgroundCheck", "Nice message");

サブスクライバーがメッセージ (WPF / Winforms にはこれらのビルド済みのものがある) を受け取ったときに、正しいスレッドへの呼び出しをディスパッチするために、独自のSynchronizationContextを使用する必要がある場合があります。

Synchronise/aysynchronise 呼び出しも許可します

于 2013-02-06T17:24:39.870 に答える
0

System.Threading.Threadこれは、またはBackgroundWorkerまたはTaskクラスのいずれかを使用すると、非常に簡単に実行できるはずです。これらのいずれかを使用して、別のスレッドでコードを実行できます。

UI に通知する必要がある場合は、イベントを発生させるだけです。イベントを作成するには、こちらをご覧ください。

C# で独自のイベントを作成するにはどうすればよいですか?

Invoke次に、正しいスレッドで最終的な UI 更新コードを実行するように を呼び出す必要があります。そのためには、これを見てください:

スレッド Control.Invoke

于 2013-02-06T17:18:24.110 に答える