简化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中文网其他相关文章!