我试图从创建表单的线程的不同线程访问表单,最后以错误结束:跨线程操作无效代码:
public static void MakeTopMost(Form form) { SetWindowPos(form.Handle, HWND_TOPMOST, 0, 0, 0, 0, TOPMOST_FLAGS); }
我正在传递一个在另一个线程中运行的表单。我试着测试InvokeRequired,但它总是假的。我是个新手。
InvokeRequired
lf3rwulv1#
请确保您正在为InvokeRequired测试正确的对象:
public static void MakeTopMost(Form form) { if (form.InvokeRequired) { form.Invoke((Action)delegate { MakeTopMost(form); }); return; } SetWindowPos(form.Handle, HWND_TOPMOST, 0, 0, 0, 0, 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, HWND_TOPMOST, 0, 0, 0, 0, TOPMOST_FLAGS));
这可能是最具可读性的。请注意,如果您在表单类本身中使用此方法,则必须使用this.SafeInvoke(...)才能访问扩展方法。
this.SafeInvoke(...)
hgtggwj02#
这对我的作品与文本控制
void updateValue(string value) { currentThread.Text = value; } this.currentThread.Invoke(updateValue, Thread.CurrentThread.Name);
2条答案
按热度按时间lf3rwulv1#
请确保您正在为
InvokeRequired
测试正确的对象:我喜欢用这样的扩展方法来总结所有这些:
您可以直接拨打:
这可能是最具可读性的。
请注意,如果您在表单类本身中使用此方法,则必须使用
this.SafeInvoke(...)
才能访问扩展方法。hgtggwj02#
这对我的作品与文本控制