簡化自動處理InvokeRequired代碼模式
在GUI事件處理中編寫傳統的InvokeRequired代碼模式既繁瑣又令人沮喪。此模式需要檢查當前線程是否可以訪問控件的句柄,如果不能,則在正確的線程上調用更改。
為了解決這個問題,我們改進了Lee的方法,並開發了一種簡化的方法:
<code class="language-csharp">public static void InvokeIfRequired(this Control control, MethodInvoker action) { // 检查可见性,如有必要则调用 while (!control.Visible) { System.Threading.Thread.Sleep(50); } if (control.InvokeRequired) { control.Invoke(action); } else { action(); } }</code>
此方法擴展了Control類,使用方法如下:
<code class="language-csharp">richEditControl1.InvokeIfRequired(() => { // 操作控件 richEditControl1.RtfText = value; RtfHelpers.AddMissingStyles(richEditControl1); });</code>
對於需要返回值的情況,您可以使用此替代實現:
<code class="language-csharp">private static T InvokeIfRequiredReturn<T>(this Control control, Func<T> function) { if (control.InvokeRequired) { return (T)control.Invoke(function); } else { return function(); } }</code>
除了Control之外,ISynchronizeInvoke接口也可以從這個方法中受益:
<code class="language-csharp">public static void InvokeIfRequired(this ISynchronizeInvoke obj, MethodInvoker action) { if (obj.InvokeRequired) { obj.Invoke(action, null); } else { action(); } }</code>
值得注意的是,ISynchronizeInvoke需要一個對像數組作為Invoke方法的參數列表。但是,如果沒有參數,您可以傳遞null,正如文檔中所述。
我們承認,當控件最初不可見時,有時可能會遇到誤報。為了解決這個問題,我們在可見性檢查中加入了50毫秒的睡眠間隔。雖然這種方法通常有效,但其有效性可能取決於您的應用程序中的具體用例和時間要求。
以上是如何在GUI事件處理中簡化Indokerequred代碼?的詳細內容。更多資訊請關注PHP中文網其他相關文章!