gpt4 book ai didi

.net - 查找 GUI 控件的所有者线程

转载 作者:行者123 更新时间:2023-12-03 12:57:43 25 4
gpt4 key购买 nike

在 .NET 应用程序上工作时,我在“跨线程操作无效”异常中运行,只是它似乎发生在正确的线程中。
有没有办法找出哪个线程是创建特定控件的线程?

到目前为止我发现了什么:

'InvokeRequired' 操作只告诉如果当前线程是“所有者线程”......
Control.Invoke(...) 上与 Reflector 一起度过一段有趣的时光方法让我找到了 user32.dll 中的 P/Invoke 方法,该方法从窗口句柄中获取线程 ID:

[DllImport("user32.dll", CharSet=CharSet.Auto, ExactSpelling=true)]
public static extern int GetWindowThreadProcessId(HandleRef hWnd, out int lpdwProcessId);

最佳答案

我遇到了同样的问题。即使使用 UI 线程中的控件,我也会遇到该异常。
就我而言,我使用的是 InvokeRequired (或 Invoke )在 Handle 之前的后台线程上控件的创建。这是一个托盘图标的上下文菜单,一些后台线程必须更改菜单项的值。如果用户从未打开上下文菜单,则永远不会创建句柄,也不会将控件绑定(bind)到 UI 线程,然后就会发生严重破坏。发生这种情况时,InvokeRequired总是返回 false 和 Invoke只是在当前线程(不是 UI 线程)上运行该方法,所以 Handle是在后台线程上创建的,并且控件永远绑定(bind)到该线程,就好像后台线程是它的 UI 线程一样。并且在尝试使用 UI 线程的控件时,抛出了跨线程异常。另一方面,如果用户在运行任何后台线程之前打开上下文菜单,一切都会正常工作。

解决方案是调用CreateControl()在启动时从 UI 线程获取方法,在任何后台线程有机会“窃取”控制权并破坏线程所有权之前。

关于.net - 查找 GUI 控件的所有者线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2342228/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com