C# 为不使用';t实现ISynchronizeInvoke

C# 为不使用';t实现ISynchronizeInvoke,c#,.net,winforms,C#,.net,Winforms,我知道ISynchronizeInvoke是确定对象是否具有线程关联的正常方法。但我发现了一些对象(至少在Windows窗体中)没有实现这一点,但仍然具有线程关联性。有没有更通用的方法来找出亲和力 我的例子是System.Windows.Forms.TreeView。这是一个控件,它实现了ISynchronizeInvoke,一切都很好。它具有返回TreeNodeCollection的Nodes属性。此集合未实现ISynchronizeInvoke,但它仍然具有相同的线程关联性,因为它的方法最终

我知道ISynchronizeInvoke是确定对象是否具有线程关联的正常方法。但我发现了一些对象(至少在Windows窗体中)没有实现这一点,但仍然具有线程关联性。有没有更通用的方法来找出亲和力

我的例子是System.Windows.Forms.TreeView。这是一个控件,它实现了ISynchronizeInvoke,一切都很好。它具有返回TreeNodeCollection的Nodes属性。此集合未实现ISynchronizeInvoke,但它仍然具有相同的线程关联性,因为它的方法最终将调用父TreeView类上的方法

我的问题是,我的应用程序有一个非常通用的机制,用户可以使用该程序调用任何.NET类上的任意属性和方法,这些调用在后台分散到多个线程。TreeViewCollection只是一个示例,我无法知道是否应该将调用打包到适当的线程。当它进来时,我只有一个物体,无法知道它从哪里来

那么,在这种情况下,有没有更通用的方法来确定线程亲和力呢

谢谢,
Phil

没有确定线程亲和力的通用方法。ISynchronizeInvoke不是一个。对不起;-)

除了文档之外,没有通用的方法


也许您可以让调用代码理解winforms中的已知对象(换句话说,硬代码名称和名称空间)。

您可以记住在应用程序中注册对象的线程,然后将回调封送回该线程。可以使用System.Threading.SynchronizationContext.Current获取未知对象的当前同步上下文。它很有可能为您提供所需的行为。

只需让代码知道它正在使用的表单对象即可。您不需要其他任何东西,控件与窗体具有相同的线程关联性。更好的是,只在工作线程中收集数据,不更新任何其他位置的任何控件,只更新BackgroundWorker.RunWorkerCompleted。