Является ли AppDomain хорошим способом обернуть плохую стороннюю библиотеку?

#.net #appdomain

#.net #appdomain

Вопрос:

Я использую стороннюю библиотеку, которая поддерживает TCP-соединение с удаленным сервером и управляет протоколом связи. Иногда он теряет соединение, поэтому у меня есть поток, который отслеживает состояние соединения и пытается подключиться повторно. Обычно он может повторно подключиться.

Проблема в том, что иногда вызовы Connect () никогда не возвращаются. Я перезапускаю процесс, он будет работать, поэтому я думаю, что в библиотеке происходит что-то странное, либо взаимоблокировка, либо какая-то статическая переменная переводится в странное состояние. Я декомпилировал код, но он слишком «креативный», чтобы быть понятным.

Мне нужно написать это таким образом, чтобы мне никогда не приходилось перезапускать процесс из-за этой сторонней библиотеки. Сама библиотека имеет 2 обратных вызова Action{T} . Является ли запуск библиотеки внутри собственного домена приложения хорошим выбором? Таким образом, если соединение обрывается и не перезапускается, я могу отключить appdomain и запустить новый. Какие соображения я должен принять?

Ответ №1:

Зависшие потоки очень проблематичны. Они неизменно зависают на каком-то собственном вызове, таком, который Thread.Не удается выполнить Abort (). Попытка выгрузить AppDomain не сработает, если поток не может быть прерван.

Тогда лучшим решением будет запуск кода в отдельном процессе, вы всегда можете запустить процесс с помощью Process.Kill(). Обратитесь к нему с помощью чего-то вроде WCF.

Комментарии:

1. 1 — единственный способ защитить себя от плохого стороннего кода — это суррогатные процессы.

Ответ №2:

Ну, очевидно, вам нужно проверить, действительно ли это решает проблему. Если это так, это достойный способ обойти. Если сторонняя библиотека полностью управляется, я полагаю, что ваш обходной путь сработает.

Я не думаю, что вы можете запрограммировать что-нибудь еще, чтобы помочь решить эту проблему. Вы можете связаться с разработчиком библиотеки или поискать похожие библиотеки в другом месте, если это вообще возможно. Лучше делать все эти вещи, когда у вас есть работоспособный обходной путь.