簡化C#
中的跨線程GUI更新
>有效地從C#的事件驅動的GUI編程中的背景線程更新UI元素通常需要InvokeRequired
模式。 這可能會變得繁瑣。 本文探討了精簡的方法。
避免常量調用
>直接使用每個UI元素訪問的Invoke()
>效率低下且容易出錯。 避免這種情況至關重要。
一種簡化的調用方法
擴展方法提供了簡潔的解決方案:InvokeIfRequired()
<code class="language-csharp">public static void InvokeIfRequired(this Control control, MethodInvoker action) { if (control.InvokeRequired) { control.Invoke(action); } else { action(); } }</code>
由於C#的閉合功能,該控件不需要明確傳遞給代表。
<code class="language-csharp">richEditControl1.InvokeIfRequired(() => { richEditControl1.RtfText = value; RtfHelpers.AddMissingStyles(richEditControl1); });</code>
對於更廣泛的適用性,將模式擴展到任何
>實施者:
ISynchronizeInvoke
這可以增強與支持線程安全UI更新(包括控件,表單和用戶控件)的各種對象的兼容性。
<code class="language-csharp">public static void InvokeIfRequired(this ISynchronizeInvoke obj, MethodInvoker action) { if (obj.InvokeRequired) { obj.Invoke(action, null); } else { action(); } }</code>
解決可見性問題
如果對控件不可見,則
InvokeRequired
這引入了延遲和潛在的並發問題。 替代策略,例如事件驅動的方法或使用專用調度員,可以避免這些問題。
以上是如何簡化C#中的跨線程GUI更新?的詳細內容。更多資訊請關注PHP中文網其他相關文章!