Mod kod InvokeRequired tradisional adalah rumit dan mengecewakan dalam pemprosesan acara GUI. Mod ini perlu menyemak sama ada benang semasa boleh mengakses pemegang kawalan.
Untuk menyelesaikan masalah ini, kami meningkatkan kaedah Lee dan mengembangkan kaedah yang mudah:
Kaedah ini telah memperluaskan kelas kawalan.
<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>
Untuk situasi yang perlu dikembalikan, anda boleh menggunakan pelaksanaan penggantian ini:
<code class="language-csharp">richEditControl1.InvokeIfRequired(() => { // 操作控件 richEditControl1.RtfText = value; RtfHelpers.AddMissingStyles(richEditControl1); });</code>
Selain mengawal, antara muka isynchronizeinvoke juga boleh mendapat manfaat daripada kaedah ini:
<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>
Perlu diingat bahawa isynchronizeinvoke memerlukan pelbagai objek sebagai senarai parameter kaedah Invoke. Walau bagaimanapun, jika tiada parameter, anda boleh lulus null, seperti yang diterangkan dalam dokumen.
<code class="language-csharp">public static void InvokeIfRequired(this ISynchronizeInvoke obj, MethodInvoker action) { if (obj.InvokeRequired) { obj.Invoke(action, null); } else { action(); } }</code>
Atas ialah kandungan terperinci Bagaimanakah saya dapat memudahkan kod InvokeRequired dalam pengendalian acara GUI?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!