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

Ult*_*nks 14 c# multithreading

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

"调用线程无法访问此对象,因为另一个线程拥有它."

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

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

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

为什么某些对象被阻止多线程访问?

Mat*_*nes 3

我认为这可以很好地解释事情,我认为这特别与 COM 有关。

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

具体来说。

一般来说,查看 COM 线程体系结构的最简单方法是将进程中的所有 COM 对象视为分为称为单元的组。COM 对象恰好存在于一个单元中,从某种意义上说,它的方法只能由属于该单元的线程合法地直接调用。任何其他想要调用该对象的线程都必须通过代理。

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

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

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

  • 那么您是否暗示 System.Printing.PrintQueue 对象实际上是一个 STA COM 对象,这就是为什么其他线程无法触及它的原因?通过查看 System.Printing.PrintQueue 文档,我如何知道这是一个 STA COM 对象? (2认同)