Самый безопасный способ прервать выполнение в коде сторонней библиотеки
Вот упрощенная версия кода в моем решении, в котором используется довольно сложный сторонний библиотечный код:
public GlitchyThirdPartyComponent GetThirdPartyComponent(Stream stream)
{
return new GlitchyThirdPartyComponent(stream);
}
Для некоторых потоков конструктор GlitchyThirdPartyComponent
полностью выходит из себя и начинает потреблять много ресурсов процессора и памяти и никогда не прекращает работу до OutOfMemoryException
происходит (где-то пахнет бесконечной петлей).
Я пытаюсь найти самый безопасный способ вызвать GetThirdPartyComponent
и затем прервите его выполнение после определенного времени ожидания, если оно все еще работает.
Я рассмотрел несколько возможных решений, но ни одно из них не подходит. Есть несколько причин для этого:
- У меня нет доступа к стороннему библиотечному исходному коду. Все сборки запутаны, поэтому разборки тоже нет
GlitchyThirdPartyComponent
не является сериализуемым, поэтому нет кросс-доменных или кросс-процессных решенийGlitchyThirdPartyComponent
скорее всего использует COM (по внешнему виду), поэтомуThread.Abort
это очень ненадежный вариант- Хотя возможно использование другой сторонней библиотеки или запросить исправление у моего текущего поставщика библиотеки, эти решения требуют времени, и моя проблема должна быть решена как можно скорее
Итак, что мне делать в этой ситуации? Является Thread.Abort
действительно лучшее решение здесь?
1 ответ
Вы могли бы обернуть звонок GlitchyThirdPartyComponent
в Task
, Тогда перерыв. Что-то вроде этого
int timeout = 1000;
var task = Task.Run(() => new GlitchyThirdPartyComponent(stream))
if (await Task.WhenAny(task, Task.Delay(timeout)) == task) {
// task completed within timeout
} else {
// timeout logic
}