0

WPFマルチスレッドアプリケーションがあり、各スレッドはxamlGUIにバインドされているオブジェクトのいくつかの変数を更新します。

通常のスレッドまたはスレッドプールを使用すると、正常に動作します。オブジェクト変数がトレッドによって変更されると、各オブジェクトはGUIでリアルタイムに更新されます。

Parallel.ForEachすべてのスレッドが終了すると実行が停止するので使いたいです。これは、インターフェイスをブロックするために(使用が待機する必要があるため)、終了したメッセージを表示できるようにするために重要です。悪い点は、Parallel.Foreachでは、すべてのスレッドが終了したときにのみ、リアルタイムで更新されないことです。

この方法は機能しますが、最後にGUIを更新するだけです。

Parallel.ForEach(Computers, new ParallelOptions { MaxDegreeOfParallelism = 1}, computer => { PingTemp(computer); });

この方法は機能しますが、ThreadPoolの最後まで待機しません。

Task.Factory.StartNew(() => Parallel.ForEach<Computer>(Computers, new ParallelOptions { MaxDegreeOfParallelism = 1 }, computer => PingTemp(computer)));

GUIがリアルタイムで更新され、スレッドプールの実行を待ってから続行する場合は、どのようなアプローチをお勧めしますか。

4

1 に答える 1

3

同じスレッドでそれをしないでください。ユーザーを待たせる必要がある場合は、UI で対話を論理的に停止するメカニズムを使用し (ff の場合は、ウィンドウの上に動作するアニメーションを含む透明なラベルを配置します)、ループの外で処理を行います。スレッドがブロックされている限り、UI インタラクション全体がブロックされます。

UI スレッドがブロックされている間、UI で更新を取得することはありません。だから、それはすでにあなたが望むものを殺します。しかし、もっと重要なことは、あなたは本当に悪いことをするということです。常に UI を自由に保ちます。

私の古いルールは 0.1/1 です。0.1 秒より長いものはすべて非 UI スレッドに入る必要があり、1 秒より長いものは UI を無効にし、動作中のアニメーションを表示する必要があります。

バインドされたメソッド シグネチャを介して自動的に処理する GUI フレームワークを使用します (このメソッド呼び出しが非同期であることを UI に伝えると、別のスレッドでルーチンが自動的に呼び出されます)。

于 2013-01-06T18:10:52.780 に答える