простой пример домена пересечения потоков? - PullRequest
2 голосов
/ 05 ноября 2010

Я немного прочитал о доменах приложений и потоках, и я наткнулся на это утверждение:

"Конкретный поток не ограничен одним доменом приложения. То есть потоки могут пересекать границы домена приложения; новый поток не создается для каждого домена приложения."

Теперь все хорошо, но я подумал: когда же произойдет пересечение доменов потоком?

Я видел примеры людей, создающих домены приложений и использующих CreateInstanceAndUnwrap и MarshalByRefObject. Но - сортировка возможна между совершенно отдельными процессами! Так что, это не то, что я называю «свободно пересекать».

Может ли кто-нибудь предоставить пример (C #) кода потока, пересекающего домены приложения без маршалинга, поскольку я не считаю это «бесплатным»? (или я просто совершенно запутался, как обычно).

Ответы [ 3 ]

1 голос
/ 05 ноября 2010

Ну, просто, CreateInstanceAndUnwrap () заставляет поток пересекать барьер AppDomain.В конце концов, созданный объект существует в AD, поток должен выполнить переход для вызова конструктора.Дополнительное пересечение происходит, когда вы затем делаете вызовы через прокси для вызова методов класса.

И AppDomain является , а не барьером для кода, он изолирует данные.Каждое объявление имеет свой собственный GC и кучу загрузчика.Сериализация необходима для преодоления этого барьера данных.Но это тот же поток, который снова десериализует и продолжает выполнение.Что совершенно не похоже на маршалинг между процессами, что имеет , что должно происходить между двумя разными потоками.С существенными накладными расходами на маршалинг между различными представлениями виртуальной памяти и требуемым переключением контекста потока.AD является намного более дешевой версией процесса.

0 голосов
/ 05 ноября 2010

Одним из примеров может быть вызов собственного кода, а собственный код вызывает обратный вызов в другом домене приложения.

А для маршалинга внутри процесса может использоваться оптимизированный маршрут, когда один и тот же поток ОС используется в нескольких доменах приложений.

0 голосов
/ 05 ноября 2010

Я не верю, что пользовательский поток может проходить через несколько доменов приложений. Однако рабочие потоки CLR, потоки GC и т.п. будут и могут это делать.

...