Re[2]: Процессы vs. потоки vs. домены
От: Konstantin_F  
Дата: 24.11.11 13:05
Оценка:
G>В .NET 4 необработанное исключение в потоке вызывает завершение домена приложения, поэтому если груpить недоверенный код, то только в отдельный домен.

G>Разные процессы — кросс-процессный маршалинг — дорого. Межу доменами должно получше работать.


В данный момент работаю над решением похожей задачи, хочу поделиться наработками, если не прав — поправьте. Если создать отдельный домен, загрузить в него сборку, создать инстанс объекта в новом домене, а для этого объекта создать прокси класс в "дефолтном" домене (используя метод Unwrap), то при возникновении исключения в новом домене, оно так же будет возникать и в "дефолтном", что приведет к уничтожению процесса, в котором находятся оба домена. Для случая, когда мы вызываем метод через прокси все предельно просто — может помочь try{}\catch{}. Для более сложных случаев, например когда в метод, который вызываеться из прокси класса делает что-то в отдельном треде, к примеру — ThreadPool.QueueUserWorkItem(delegate {Thread.Sleep(1000); throw new Exception();}) все немного сложнее.

На данный момент нам удалось побороть "падение" процесса для таких случаев, путем добавления
" <runtime>
<!-- the following setting prevents the host from closing when an unhandled exception is thrown -->
<legacyUnhandledExceptionPolicy enabled="1" />
</runtime> "
В конфигурационный файл исполнаяемого файла, который так же передается в создаваемый домен

var setup = new AppDomainSetup {
ApplicationBase = AppDomain.CurrentDomain.BaseDirectory,
ConfigurationFile = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Имя_исполняемого_файла.exe.config")};

Выгрузка же домена произоводиться при возникновении события UnhandledException созданного домена.

Если кто-то может подсказать более хорошее решение, буду очень благодарен.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.