Почему некоторые объекты недоступны из разных потоков?
Я сталкивался с этой проблемой несколько раз, развиваясь в С#. Я буду счастливо кодироваться, передавая объекты туда и обратно между потоками, а что нет, то вдруг я получаю эту знакомую ошибку:
"Вызывающий поток не может получить доступ к этому объекту, потому что другой нить владеет им."
Хорошо, хорошо, я общался с этим раньше, особенно с объектами в потоке графического интерфейса. Вам просто нужно написать дополнительный код для программирования вокруг этой конкретной проблемы. Но каждый раз, когда я сталкиваюсь с объектом, который, во что бы то ни стало, является обычным, но ему не нравится доступ к другим потокам.
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 в многопоточном режиме квартиры синхронизируются самими объектами.