У меня в дополнительном AppDomain приложение выкидывает exception и крашит основное приложение, я почему то думал, что домены как раз придумали, что бы этого не случалось. Я не прав?
Здравствуйте, Alex Dav, Вы писали:
AD>У меня в дополнительном AppDomain приложение выкидывает exception и крашит основное приложение, я почему то думал, что домены как раз придумали, что бы этого не случалось. Я не прав?
Здравствуйте, Alex Dav, Вы писали:
AD>У меня в дополнительном AppDomain приложение выкидывает exception и крашит основное приложение, я почему то думал, что домены как раз придумали, что бы этого не случалось. Я не прав?
Домены придумали для того, чтобы можно было перезапускать отдельные части приложения если они перешли в несогласованное состояние.
Например, перезапуск плагина, после того как он закрешился (ессно надо обрабатывать исключение в основном приложении) и все его статические мемберы теперь стали неюзабельным мусором.
Здравствуйте, vvlad.net, Вы писали: VN>Домены придумали для того, чтобы можно было перезапускать отдельные части приложения если они перешли в несогласованное состояние.
Ребят, а ничо, что вы тут ерунду несёте? Ну, по кр. мере несогласованную с основной документацией:
Application domains, which are represented by AppDomain objects, help provide isolation, unloading, and security boundaries for executing managed code.
Use application domains to isolate tasks that might bring down a process.
Если уж как-то понимать слово "изоляция", то уж точно именно в стиле "нам пофиг иксепшены другого домена".
Здравствуйте, matumba, Вы писали:
M>Если уж как-то понимать слово "изоляция", то уж точно именно в стиле "нам пофиг иксепшены другого домена".
Ндя... похоже это я ерунду несу (извиняюсь ответчикам): всю жизнь думал, что домен — надёжная изоляция кода, а оказывается вот:
"AppDomain.UnhandledException Event" —
This event provides notification of uncaught exceptions. It allows the application to log information about the exception before the system default handler reports the exception to the user and terminates the application.
Другими словами, если ты иксепшын домена не ловил, он завалит всё остальное. Ндя... я был лучшего мнения о программерах мелкософта!
Здравствуйте, matumba, Вы писали:
M>...всю жизнь думал, что домен — надёжная изоляция кода, а оказывается вот:
Вот и я вчера на этом попался — везде читал, что если вдруг бах в доп. домене, то главное приложение живет, а оказалось надо еще потанцевать.
А что будет, если доп. домен вообще не кинул exception? просто взял и "закрылся"?
Здравствуйте, matumba, Вы писали:
M>Здравствуйте, matumba, Вы писали:
M>>Если уж как-то понимать слово "изоляция", то уж точно именно в стиле "нам пофиг иксепшены другого домена".
M>Ндя... похоже это я ерунду несу (извиняюсь ответчикам): всю жизнь думал, что домен — надёжная изоляция кода, а оказывается вот:
M>"AppDomain.UnhandledException Event" — M>This event provides notification of uncaught exceptions. It allows the application to log information about the exception before the system default handler reports the exception to the user and terminates the application.
M>Другими словами, если ты иксепшын домена не ловил, он завалит всё остальное. Ндя... я был лучшего мнения о программерах мелкософта!
Ну так изоляция данных — это и есть первая причина введения доменов, тут ты прав. Но домен не изолирует потоки, поэтому исключения проходят сквозь домены беспрепятственно (ибо к данным не относятся).
Здравствуйте, Alex Dav, Вы писали:
AD>Здравствуйте, matumba, Вы писали:
M>>...всю жизнь думал, что домен — надёжная изоляция кода, а оказывается вот: AD>Вот и я вчера на этом попался — везде читал, что если вдруг бах в доп. домене, то главное приложение живет, а оказалось надо еще потанцевать.
AD>А что будет, если доп. домен вообще не кинул exception? просто взял и "закрылся"?
Ну такую ситуацию представить трудно... Домен можно закрыть (Unload) но это контролируется разработчиком. Ну и сделать это можно только снаружи, пока через домен проходит хоть один поток — он заблокирован отвыгрузки.
Кроме того, домен — это нее поток, а просто область данных, закрыться сам он не может, ибо не выполняется.
Вот здесь очень неплохо написано про домены.
Собственно, если я правильно понимаю, если приложение не должно падать в случае падения не основного(тот, который поумолчанию)
домена, но для этого надо такое поведение как-то грамотно обрабатывать. Подробнее можно почитать про плагинную архитектуру на
основе доменов.
Здравствуйте, vvlad.net, Вы писали:
VN>Кроме того, домен — это нее поток, а просто область данных, закрыться сам он не может, ибо не выполняется.
Получается, если у меня в домене закрашится dll, то она завалит все приложение?
Здравствуйте, Alex Dav, Вы писали:
AD>Здравствуйте, vvlad.net, Вы писали:
VN>>Кроме того, домен — это нее поток, а просто область данных, закрыться сам он не может, ибо не выполняется. AD>Получается, если у меня в домене закрашится dll, то она завалит все приложение?
Нет — если ты перехватишь исключение.
try
{
call to some function in other domain...
}
catch(Exception)
{
failover...
}
Тут сценарий получается такой же, как и без использования домена.
Просто надо понимать, что домен изолирует данные, НЕ поток выполнения.
Используется, если надо например, разные значения для статических полей.
Экземпляр синглтона уникален в домене, не процессе.
ASP.NET — каждое приложение запускается в собственном домене.
К твоему вопросу:
— если dll бросает исключение, то домены это не разруливают.
— если dll после креша неюзабельна (ибо говнокод в глобальном состоянии dll) — то домены это разруливают. Делаешь unload и создаешь новый домен.
Здравствуйте, vvlad.net, Вы писали:
VN>Ну так изоляция данных — это и есть первая причина введения доменов
Допустим. Но что вам подсказывает интуиция после вот этих слов? "Use application domains to isolate tasks that might bring down a process." — по-моему, тут "процесс" и относится именно к выполнению, а не данным. Мелкомягкие словопуты?
Здравствуйте, matumba, Вы писали:
VN>>Ну так изоляция данных — это и есть первая причина введения доменов
M>Допустим. Но что вам подсказывает интуиция после вот этих слов? "Use application domains to isolate tasks that might bring down a process." — по-моему, тут "процесс" и относится именно к выполнению, а не данным. Мелкомягкие словопуты?
В терминах win.api "process" всегда был именно областью данных. Когда крашился/завершался последний поток процесса — процесс выгружался. Тут дали sandbox — часть данных можно положить в отдельную кучку, которую можно целиком выбрасывать, когда там что-то сломается.
А что еще кроме данных можно "защищать"? Защищать потоки исполнения? Как вы это представляете? runtime-e поймав unhandled exception начинает думать: "тааак тут у меня поток освободился — что бы ему подсунуть на исполнение?"