私はWPF &のC#アプリケーションで、頻繁に変化する値の束を監視するために、約35列×50行の大きなDataGridを含んでいます。問題は、グリッド全体が表示されているときに、それをリフレッシュすると、ほぼ1秒間ユーザーインターフェイスがハングアップするということです。明示的に2秒ごとにリフレッシュしますが、これは私がやっていることでうまくいきますが、残りのUIをハングアップさせるのは本当の苦痛です。マルチスレッド、マルチディスパッチャーWPFアプリケーションはまだ1つのスレッドで描画しますか?
OKだから、私はUIの残りの部分を独立したディスパッチャーを持つ別のスレッドの別のウィンドウで実行すると決めました。 DispatcherTimerを使って1秒に10回更新するインクリメントカウントを持つtextBlockを含むおもちゃウィンドウを作成しました。しかし、カウントがスムーズにインクリメントするのではなく、グリッドがリフレッシュされている間に一時停止し、の表示を再開し、カウント数はを一時停止したときより約10高くなり、タイマーイベントが処理されます。私はちょうどリフレッシュを見ていないよ。
WPFは、すべての要素を1つのスレッドに描画しますか?それのまわりで何か?
は、ここに私の第二のウィンドウを作成するコードです:
private void Window_Loaded(object sender, RoutedEventArgs e)
{
ThreadStart ts = new ThreadStart(RunSpareThread);
m_spare_thread = new Thread(ts);
m_spare_thread.IsBackground = true;
m_spare_thread.Priority = ThreadPriority.Highest;
m_spare_thread.SetApartmentState(ApartmentState.STA);
m_spare_thread.Start();
Dispatcher.Thread.Priority = ThreadPriority.Lowest;
}
void RunSpareThread()
{
m_spare_window = new SpareWindow();
m_spare_window.Show();
Dispatcher.Run();
}
はFYI私は、グリッドを実装するいくつかの異なる方法試してみた - リストビューなど、OnRenderをオーバーライドし、GlyphRunDrawingsの全体の束を描くキャンバスとして - WPFをこのようなことを描くのは非常に遅いです。