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

时间:2012-07-03 19:02:30

标签: c# multithreading

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

  

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

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

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

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

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

1 个答案:

答案 0 :(得分:3)

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

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

特异性。

  

通常,查看COM线程体系结构的最简单方法是   将流程中的所有COM对象视为分组   叫公寓。一个COM对象只存在于一个公寓中   意识到它的方法只能由一个线程合法地直接调用   属于那套公寓。任何其他想要调用的线程   该对象必须通过代理。

     

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

     

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

     

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