我在使用C#开发时多次遇到过这个问题。我会愉快地编写代码,在线程之间来回传递对象,什么不是,然后突然间我得到了这个熟悉的错误:
“调用线程无法访问此对象,因为它不同 线程拥有它。“
好吧,好吧,我以前处理过它,尤其是GUI线程上的对象。您只需要编写一些额外的代码来围绕特定的问题进行编程。但是每当我遇到一个普通的对象时,它就不喜欢被不同的线程访问了。
编辑我在原帖中误解了导致访问异常的对象。它不是 IPAddress ,而是我用来获取IP地址的 System.Printing.PrintQueue. 。这是您无法从多个线程评估的对象。
我写的所有课程都没有这个问题。我甚至不知道自己如何实现这一点。您是否必须使用创建您的线程ID保留成员变量,然后在每个属性和方法访问权限上检查当前线程?这看起来很疯狂。为什么微软决定......“好吧...... PrintQueue,绝对不能在线程中共享。但是这些其他类......他们的好处就是去。”
为什么某些对象会被多线程访问阻止?
答案 0 :(得分:3)
我认为这可以很好地解释事情,我认为这与COM有关。
http://msdn.microsoft.com/en-us/library/ms693344%28v=vs.85%29
特异性。
通常,查看COM线程体系结构的最简单方法是 将流程中的所有COM对象视为分组 叫公寓。一个COM对象只存在于一个公寓中 意识到它的方法只能由一个线程合法地直接调用 属于那套公寓。任何其他想要调用的线程 该对象必须通过代理。
有两种类型的公寓:单线程公寓,和 多线程公寓。
单线程公寓只包含一个线程,因此住在单线程公寓中的所有COM对象都可以接收 方法仅从属于该公寓的一个线程调用。 对单线程单元中的COM对象的所有方法调用都是 与单线程的Windows消息队列同步 公寓的主题。具有单个执行线程的进程是 只是这个模型的一个特例。
多线程公寓由一个或多个线程组成,因此住在多线程公寓中的所有COM对象都可以接收方法 直接从属于的任何线程调用 多线程公寓。多线程公寓中的线程使用a 模型称为自由线程。在多线程中调用COM对象 公寓由物品本身同步。