それでは、どのようにこの問題を解決するには?通常の練習は時間のかかるスレッドプール内の関数を実行し、表示を更新するには、メインUIスレッドに戻ってカットすることです。次のように書き換え機能を上記UpdateTime:
プライベート非同期無効updateTime()
{
(真)しながら、
{
Task.Runを待つ(()=>のThread.sleep(900));
textBlock.Text = DateTime.Now.ToString()。
Task.Delayを待つ(100)。
}
}
このように、私たちは、ほとんどのニーズを満たすことができます。ただし、一部の操作は比較的時間がかかります。マルチウィンドウリアルタイム監視が、我々は毎秒数十倍のダース以上のものを選別する必要がある場合たとえば、各リフレッシュ画像は、この操作は、UIスレッドで実行する必要があり、更新され、そしてそれは非常に時間がかかり、この時間を持っていますカトンの状況が先頭に戻ります。
この問題は、実際には、WPFは単にプログラムへのクロススレッドのアクセスを許可されていない、と思われる解決できない、マルチスレッドインタフェースを更新することはできません。私たちは、それぞれのビデオ・モニタリングウィンドウのための独立したその別のスレッドを持つことができ、更新操作はスレッドで、それはメインスレッドには影響しません。MSDNの記事があります。詳細な動作について説明します。マルチスレッドは、UI:HostVisual。次のようにこのように、元のプログラムが書き換えられます。
E)
{
();
(hostVisual)。
.Content =コンテンツ;
(()=>
{
(hostVisual);
();
control.Arrange(()、content.RenderSize))。
visualTarget.RootVisual =コントロール;
System.Windows.Threading..Run();
}))。
thread.SetApartmentState(.STA)。
thread.IsBackground =;
thread.Start();
}
{
子。
子)
{
)
);
.child =子。
AddVisualChild(子)。
}
インデックス)
{
。
}
VisualChildrenCount
{
1。}
}
}
HostVisual、VisualTarget:二つの新しいクラスのための内部。そしてVisualHostはそれを自分自身を書きました。MSDNには、関連する解釈上、導入されていない、ここで理解することは難しいことではありません。最後に、再び次のように読み取るように制御モードで新しいスレッドを作成するには、コードをリファクタリング:
E)
{
createChildInNewThread <)。
}
コンテナ)
()
{
();
(hostVisual)。
container.Content =コンテンツ;
(()=>
{
(hostVisual);
();
control.Arrange(()、content.RenderSize))。
visualTarget.RootVisual =コントロール;
System.Windows.Threading..Run();
}))。
thread.SetApartmentState(.STA)。
thread.IsBackground =;
thread.Start();
}
もちろん、私の機能より、不要な制限:コンテナはContentControlにでなければならない、子要素はのUIElementでなければなりません。これは、実際のニーズに応じて変更実行することができます。