0

どうすればこの問題を管理できるか助けが必要です。

シナリオ:

  1. 3 つのスレッド (それぞれ異なる値を持つ) を開始します (TPL または ThreadPool を使用)
  2. 各スレッドはいくつかの異なるデータを収集します
  3. スレッドからの特定のデータを使用して foreach スレッド ウィンドウを開きます
  4. ユーザーは各ウィンドウに何らかの値を入力します
  5. 値は特定のスレッドに送り返されます
  6. いくつかの追加作業
  7. 終了した

さて、問題は、GUI スレッド (ApartmentState.STA) でなければならないため、スレッド内でウィンドウを開くことができないことです。

ウィンドウ/ユーザー入力の問題をどのように処理できますか?

4

2 に答える 2

2

http://eprystupa.wordpress.com/2008/07/28/running-wpf-application-with-multiple-ui-threads/

ウィンドウごとに個別のUIスレッドを設定する方法について説明します。

private void OnCreateNewWindow( object sender,   RoutedEventArgs e)
{
 Thread thread = new Thread(() =>
{
 Window1 w = new Window1();
 w.Show();

 w.Closed += (sender2, e2) =>
  w.Dispatcher.InvokeShutdown();

 System.Windows.Threading.Dispatcher.Run();
});

 thread.SetApartmentState(ApartmentState.STA);
 thread.Start();
}
于 2012-07-19T10:35:35.917 に答える
0

私が通常行うことは、各スレッドにデータを収集させ、BeginInvoke 自体を GUI スレッドに送り、AutoResetEvent/Semaphore を待機させることです。GUI スレッドはメッセージを取得し、スレッド インスタンスからのデータを含むフォームなどを表示します。通常のコンポーネント コールバック (GUI スレッド コンテキスト内) は、スレッド メンバーにユーザーなどからの追加データをロードし、ユーザー入力フォームが閉じられるか、[OK] ボタンがクリックされると、イベント/セマを通知します。作業スレッドは、追加のユーザー データが読み込まれた状態で実行されます。

スレッド オブジェクトを BeginInvoke する必要はありません。必要に応じて、メンバー データとシグナルするイベントのみを含む他の 'ThreadComms' オブジェクトを投稿できます。

これは基本的に確実に機能する 1 つのソリューションであり、他にも間違いなく機能します。スレッドが 3 つある場合、いつでも 3 つのユーザー入力フォームがポップアップする可能性があるため、少し混乱することがあります (面倒なことに、スレッド 2/3 からの新しいフォームは、ユーザーが入力の途中でポップアップします)。スレッド 1 のフォーム)。

Invoke() を実行することもできますが、可能であれば、直接的な同期スレッド間通信を避けるようにしています。Invoke() とモーダル フォームは、ユーザーが入力に忙しいときに新しいフォームがポップアップする問題を解決するかもしれません。試してみませんか?

于 2012-07-19T12:13:39.613 に答える