Есть ли способ, как хотя бы отложить завершение управляемого приложения (на несколько десятков миллисекунд) и установить некоторый общий флаг, чтобы дать другим потокам возможность изящно завершиться (сам поток SO, очевидно, больше ничего не будет выполнять)? Я подумываю использовать для этого отладчик JIT или хостинг CLR - мне любопытно, пробовал ли кто-нибудь это раньше.
Зачем мне делать что-то не так?
Без лишних подробностей — представьте себе эту аналогию — вы в казино делаете ставку на рулетку и вдруг обнаруживаете, что рулетка — ненадежная подделка. Итак, вы хотите немедленно покинуть казино, НО, скорее всего, хотите сначала забрать свои ставки со стола. К сожалению, я не могу использовать для этого отдельный процесс, так как существуют очень жесткие требования к производительности.
Попытался, но не получилось:
Поведение .NET для StackOverflowException (и противоречивая информация в MSDN) несколько раз обсуждалось на SO, чтобы быстро подвести итог:
HandleProcessCorruptedStateExceptionsAttribute (например, в обработчике необработанных исключений домена приложения) не работает
ExecuteCodeWithGuaranteedCleanup а> не работает
legacyUnhandledExceptionPolicy не работает
Может быть несколько других попыток обработки исключений StackOverflowException, но кажется очевидным, что CLR завершает весь процесс, как указано в отличный ответ от Ганса Пассанта.
Хотим попробовать:
- JIT-отладчик - оставить поток с исключением замороженным, установить какой-либо общий флаг (вероятно, в закрепленном месте) и на короткое время разморозить другие потоки.
- Размещение CLR и настройка политики необработанных исключений
У вас есть другая идея? Или есть опыт (успешный/неудачный) с этими двумя способами?