プロジェクトで、ソースがないライブラリからのビジュアルコントロールを使用しています。
これらの3つのコントロールを一度に画面に表示してUIの応答性を高めるには、更新に時間がかかりすぎます(およそ200ミリ秒)。(3つすべてを一度に更新する必要があるかもしれません。これにより、すべてが考えている間、UIが約600ミリ秒間スタックしたままになります)。
TaskSchedulersに関するいくつかの投稿を読み、これらの各コントロールを独自のスレッドで実行する方法として、並列タスク機能の調査を開始しています。プラットフォームはマルチコアになるので、同時処理を活用したいと思います。
問題は、私がこれについてどうやって行くのかわからないことさえ知らないということです。
WPFのメインUIスレッドとは別のスレッドでコントロールを実行するための適切なデザインパターンはありますか?
具体的には、サードパーティのマップコントロールであり、新しい場所またはズームレベルを指定すると、再描画に非常に長い時間がかかります(〜200ms)。おそらくこれらのうち3つを最大4Hzで更新すると、明らかに追いつかなくなります
。WPFコントロールをユーザーコントロールにカプセル化したので、ユーザー入力(マウスクリック)をキャプチャしながら、各インスタンスを独自のスレッドで実行する必要があります。 、 例えば)。
更新:私は解決策を探していますが、これまでに次のことを実装しました。
私のメイン(UI)スレッドは、問題のコントロールを含む新しいウィンドウを作成するスレッドを生成し、それを正しい位置に配置します(これにより、通常のコントロールのように見えます)。
_leftTopThread = new Thread(() =>
{
_topLeftMap = new MapWindow()
{
WindowStartupLocation = WindowStartupLocation.Manual,
Width = leftLocation.Width,
Height = leftLocation.Height,
Left = leftLocation.X,
Top = leftLocation.Y,
CommandQueue = _leftMapCommandQueue,
};
_topLeftMap.Show();
System.Windows.Threading.Dispatcher.Run();
});
_leftTopThread.SetApartmentState(ApartmentState.STA);
_leftTopThread.IsBackground = true;
_leftTopThread.Name = "LeftTop";
_leftTopThread.Start();
マップにコマンドを送信する(場所を移動するなど)ためのスレッドセーフなBlockingCollectionCommandQueue
キューはどこにありますか。
問題は、私がどちらかをできるようになったということです
System.Windows.Threading.Dispatcher.Run()
呼び出しによるユーザー入力があります- またはCommandQueueでブロックし、メインスレッドから送信されたコマンドをリッスンします
コマンドを待ってスピンすることはできません。スレッドのCPUをすべて吸収してしまうからです。イベントメッセージポンプ
をブロックして機能させることは可能ですか?