Почему некоторые объекты недоступны из разных потоков?

Я сталкивался с этой проблемой несколько раз, развиваясь в С#. Я буду счастливо кодироваться, передавая объекты туда и обратно между потоками, а что нет, то вдруг я получаю эту знакомую ошибку:

"Вызывающий поток не может получить доступ к этому объекту, потому что другой нить владеет им."

Хорошо, хорошо, я общался с этим раньше, особенно с объектами в потоке графического интерфейса. Вам просто нужно написать дополнительный код для программирования вокруг этой конкретной проблемы. Но каждый раз, когда я сталкиваюсь с объектом, который, во что бы то ни стало, является обычным, но ему не нравится доступ к другим потокам.

EDIT Я ошибался в своем первоначальном посте об объекте, который вызывал исключение доступа. Это не было IPAddress, вместо этого его System.Printing.PrintQueue., который я использовал для получения IP-адреса. Это объект, который вы не можете оценить более чем из 1 потока.

Все мои классы, которые я написал, никогда не имеют этой проблемы. Я даже не знаю, как это реализовать. Вам нужно было бы сохранить переменную-член с идентификатором потока, который создал вас, а затем проверить текущий поток на то, что каждый доступ к каждому свойству и методу? Это кажется сумасшедшим. Почему Microsoft решила, что..... "ОК... PrintQueue, определенно не разделяется между потоками. Но эти другие классы... их хорошо идти".

Почему некоторые объекты заблокированы от доступа к нескольким потокам?

Ответы

Ответ 1

Я думаю, что это может объяснить вещи достаточно хорошо, я думаю, что это конкретно связано с COM.

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

конкретно.

В общем, самый простой способ просмотра архитектуры потоковой передачи COM - думать обо всех COM-объектах в процессе, разделенных на группы называемых квартирами. Объект COM живет ровно в одной квартире, в что его методы юридически могут быть непосредственно вызваны только потоком что принадлежит этой квартире. Любой другой поток, который хочет позвонить объект должен пройти через прокси.

Существует два типа квартир: однопоточные квартиры и многопотоковые квартиры.

Однопоточные квартиры состоят из ровно одного потока, поэтому все объекты COM, которые живут в однопоточной квартире, могут получать метод вызывает только один поток, принадлежащий этой квартире. Все вызовы методов для COM-объекта в однопоточной квартире синхронизируется с очередью сообщений Windows для однопоточной квартира нить. Процесс с одним потоком выполнения просто частный случай этой модели.

Многопоточные квартиры состоят из одного или нескольких потоков, поэтому все объекты COM, которые живут в многопоточной квартире, могут получать метод вызовы непосредственно из любого из потоков, принадлежащих многопоточная квартира. Темы в многопоточной квартире используют модель называется free-threading. Вызов объектов COM в многопоточном режиме квартиры синхронизируются самими объектами.