为什么某些对象无法从不同的线程访问?

在使用C#进行开发时,我多次遇到过这个问题。 我将是一个快乐的编码,在线程之间来回传递对象,什么不是,然后我突然得到这个熟悉的错误:

“调用线程无法访问此对象,因为不同的线程拥有它。”

好吧,好吧,我之前已经处理过,尤其是GUI线程上的对象。 您只需编写一些额外的代码来围绕该特定问题进行编程。 但每当我遇到一个普通的对象时,它就不喜欢被不同的线程访问了。

编辑我在原始post中误解了导致访问exception的对象。 它不是IPAddress ,而是System.Printing.PrintQueue。 我用它来获取IP地址。 这是您无法从多个线程评估的对象。

我写的所有课程都没有这个问题。 我甚至不知道自己如何实现这一点。 您是否必须使用创建您的线程ID保留成员变量,然后在每个属性和方法访问权限上检查当前线程? 这看起来很疯狂。 为什么微软会决定……“好吧…… PrintQueue,绝对不能在线程中共享。但是这些其他类……他们的好处就是去。”

为什么某些对象被阻止multithreading访问?

我认为这可以解释得很好,我认为这与COM有关。

http://msdn.microsoft.com/en-us/library/ms693344%28v=vs.85%29

特别。

通常,查看COM线程体系结构的最简单方法是将进程中的所有COM对象视为分为称为apartments的组。 COM对象恰好位于一个公寓中,因为它的方法只能由属于该公寓的线程直接调用。 任何其他想要调用该对象的线程都必须通过代理。

有两种类型的公寓:单线程公寓和multithreading公寓。

单线程单元只包含一个线程,因此位于单线程单元中的所有COM对象只能从属于该单元的一个线程接收方法调用。 对单线程单元中的COM对象的所有方法调用都与单线程单元的线程的Windows消息队列同步。 具有单个执行线程的进程只是该模型的特例。

multithreading公寓由一个或多个线程组成,因此生活在multithreading单元中的所有COM对象都可以直接从属于multithreading单元的任何线程接收方法调用。 multithreading单元中的线程使用称为自由线程的模型。 multithreading单元中对COM对象的调用由对象本身同步。