Vb.net 如何以编程方式找到控件的拥有线程

Vb.net 如何以编程方式找到控件的拥有线程,vb.net,visual-studio,user-controls,invoke,owner,Vb.net,Visual Studio,User Controls,Invoke,Owner,所有.net控件都必须在主线程上创建,如果要将控件与通常情况下的接口集成,至少这是必要的。此外,要修改控件的属性,必须使用自己的调用方法从控件的线程调用该方法 有没有一种方法可以查看控件并直接识别其所属线程 另外或者相反,是否可以检测当前线程是否是主线程?VisualStudio将该线程标识为运行时可以看到的主线程,是否有什么特别之处,或者仅仅是因为这是VS执行以初始化调试的第一个线程 另外或者相反,是否可以检测当前线程是否是主线程 您可以使用查看您是否处于适当的线程上。如果不是,那么应该使用或

所有.net控件都必须在主线程上创建,如果要将控件与通常情况下的接口集成,至少这是必要的。此外,要修改控件的属性,必须使用自己的调用方法从控件的线程调用该方法

有没有一种方法可以查看控件并直接识别其所属线程

另外或者相反,是否可以检测当前线程是否是主线程?VisualStudio将该线程标识为运行时可以看到的主线程,是否有什么特别之处,或者仅仅是因为这是VS执行以初始化调试的第一个线程

另外或者相反,是否可以检测当前线程是否是主线程

您可以使用查看您是否处于适当的线程上。如果不是,那么应该使用或将调用封送回拥有线程

VisualStudio将该线程标识为运行时可以看到的主线程,是否有什么特别之处,或者仅仅是因为这是VS执行以初始化调试的第一个线程

它实际上是用来创建的线程,该线程正在处理Windows消息泵。此线程将或应始终标记为STA线程,请参阅,并具有适当的同步上下文和消息泵运行。Run方法在普通Windows窗体应用程序的主线程中设置此设置

另外或者相反,是否可以检测当前线程是否是主线程

您可以使用查看您是否处于适当的线程上。如果不是,那么应该使用或将调用封送回拥有线程

VisualStudio将该线程标识为运行时可以看到的主线程,是否有什么特别之处,或者仅仅是因为这是VS执行以初始化调试的第一个线程


它实际上是用来创建的线程,该线程正在处理Windows消息泵。此线程将或应始终标记为STA线程,请参阅,并具有适当的同步上下文和消息泵运行。Run方法在普通Windows窗体应用程序的主线程中设置此设置

+1这个-但是,如果你真的需要,你可以做Control.Invoke-但是我看不到什么好处。我使用了InvokeRequired,但是正如一些人所指出的,在创建控件句柄之前,这是不起作用的。似乎拥有线程被专门定义为负责调用CreateHandle的线程。然而,关于和控件及其线程之间的关系在何处维护,以及是否可以通过编程方式查看此关系,问题仍然悬而未决。@JCollins除了invokererequired之外,没有直接的方法访问此关系。在内部,它使用GetWindowThreadProcessId获取拥有内部HWND控件.Handle的线程,然后使用GetCurrentThreadId检查以确保执行的线程是同一个线程。这两个方法都不是直接在托管代码中公开的。@JCollins如果出于某种原因,这还不够好,您可以使用P/Invoke访问这些调用,但我不确定它除了检查以确保您在正确的线程上之外还有什么作用。请注意,本机线程ID不一定与thread.CurrentThread.ManagedThreadId相同,因此您不能依赖于此。多亏了Reed,最终我的解决方案是使用CreateHandle更可靠地执行调用,这就成了一个关于如何或在何处管理它的好奇问题,并且可能是一个有用的调试工具。此外,基于看似不可见且有时不可靠的控件“拥有”关联来识别要调用的线程似乎很迂回。+1这一点-但是,如果您真的需要,您可以执行control.invoke-但我看不到什么好处。我使用了invokererequired,但正如一些人所指出的,在创建控件的句柄之前,这将不起作用。似乎拥有线程被专门定义为负责调用CreateHandle的线程。然而,关于和控件及其线程之间的关系在何处维护,以及是否可以通过编程方式查看此关系,问题仍然悬而未决。@JCollins除了invokererequired之外,没有直接的方法访问此关系。在内部,它使用GetWindowThreadProcessId获取拥有内部HWND控件.Handle的线程,然后使用GetCurrentThreadId检查以确保执行的线程是同一个线程。这两个方法都不是直接在托管代码中公开的。@JCollins如果由于某种原因,这还不够好,您可以使用P/Invoke来访问这些调用,但我不是
你知道除了检查你的思路是否正确之外,它还有什么作用。请注意,本机线程ID不一定与thread.CurrentThread.ManagedThreadId相同,因此您不能依赖于此。多亏了Reed,最终我的解决方案是使用CreateHandle更可靠地执行调用,这就成了一个关于如何或在何处管理它的好奇问题,并且可能是一个有用的调试工具。此外,基于看似不可见且有时不可靠的与控件的“拥有”关联来识别要调用的线程似乎很迂回。