c# – 在SetWindowPos()中使跨线程操作无效
发布时间:2020-12-16 00:12:14 所属栏目:百科 来源:网络整理
导读:我试图从一个不同的线程访问一个表单到创建表单的表单,最后得到一个错误: Cross thread operation not valid 码: public static void MakeTopMost(Form form){ SetWindowPos(form.Handle,HWND_TOPMOST,TOPMOST_FLAGS);} 我正在传递一个在另一个线程中运行
我试图从一个不同的线程访问一个表单到创建表单的表单,最后得到一个错误:
码: public static void MakeTopMost(Form form) { SetWindowPos(form.Handle,HWND_TOPMOST,TOPMOST_FLAGS); } 我正在传递一个在另一个线程中运行的表单.我试过测试InvokeRequired,但它总是假的. 我是线程新手. 解决方法
确保您正在为InvokeRequired测试正确的对象:
public static void MakeTopMost(Form form) { if (form.InvokeRequired) { form.Invoke((Action)delegate { MakeTopMost(form); }); return; } SetWindowPos(form.Handle,TOPMOST_FLAGS); } 我喜欢用这样的扩展方法包装所有这些: public static class SynchronizeInvokeUtil { public static void SafeInvoke(this ISynchroniseInvoke sync,Action action) { if (sync.InvokeRequired) sync.Invoke(action); else action(); } public static void SafeBeginInvoke(this ISynchroniseInvoke sync,Action action) { if (sync.InvokeRequired) sync.BeginInvoke(action); else action(); } } 然后你可以打电话: form.SafeInvoke(() => SetWindowPos(form.Handle,TOPMOST_FLAGS)); 这可能是最具可读性的. 请注意,如果您在表单类本身中使用它,则必须使用this.SafeInvoke(…)才能访问扩展方法. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |