マルチスレッドアプリケーションを開発するときに、繰り返しのコードを書く必要があるという点で、WPF(およびそれ以前のWindows Forms)で何かを見逃しましたか?アプリケーションのすべてのUIコントロールは、各プロパティを取得して設定するために余分なコード行を必要とします。WPF UIコントロールに対するマルチスレッドアクセスのオーバーヘッドはなぜですか?
internal delegate void SetElementIsEnabledDelegate(UIElement element, bool isEnabled);
internal delegate void SetBrushesAndTextDelegate(Brush foregroundBrush, string message);
internal delegate void SetCheckBoxCheckedDelegate(CheckBox checkbox, bool checkedValue);
internal delegate void SetTextBoxTextDelegate(TextBox richTextBox, string text);
internal delegate void SetRichTextBoxTextDelegate(RichTextBox textBox, string text);
internal static void SetElementIsEnabled(UIElement element, bool isEnabled)
{
if (element.Dispatcher.Thread != Thread.CurrentThread)
{
// Execute the same method, but this time on the GUI thread
element.Dispatcher.Invoke(DispatcherPriority.Normal, new SetElementIsEnabledDelegate(SetElementIsEnabled), element, isEnabled);
return;
}
element.IsEnabled = isEnabled;
}
さらに30の代理人とそれにrespecitveメソッドを追加します。
私が知っている限り、スレッドを呼び出すすべての操作を行う必要性のない型の安全な方法はありません。また、これは、コントロールライブラリのフードの下で簡単に処理された可能性があるようです。私は間違った何かをしていますか、なぜMicrosoftはコントロールで呼び出されたスレッドを世話しないことにしましたか?
は、パフォーマンスの観点から、UIコントロールが同じである場合に必要な一切マーシャリングはありません糸。 – sipwiz
しかしマーシャリングのチェックが必要です。 –
私は小切手のオーバーヘッドが小さいと思います。おそらく、2つのスレッドIDを比較するif文と同じくらい簡単です。 – sipwiz