Самый безопасный способ прервать выполнение в коде сторонней библиотеки

Вот упрощенная версия кода в моем решении, в котором используется довольно сложный сторонний библиотечный код:

public GlitchyThirdPartyComponent GetThirdPartyComponent(Stream stream)
{
    return new GlitchyThirdPartyComponent(stream);
}

Для некоторых потоков конструктор GlitchyThirdPartyComponent полностью выходит из себя и начинает потреблять много ресурсов процессора и памяти и никогда не прекращает работу до OutOfMemoryException происходит (где-то пахнет бесконечной петлей).

Я пытаюсь найти самый безопасный способ вызвать GetThirdPartyComponent и затем прервите его выполнение после определенного времени ожидания, если оно все еще работает.

Я рассмотрел несколько возможных решений, но ни одно из них не подходит. Есть несколько причин для этого:

  1. У меня нет доступа к стороннему библиотечному исходному коду. Все сборки запутаны, поэтому разборки тоже нет
  2. GlitchyThirdPartyComponent не является сериализуемым, поэтому нет кросс-доменных или кросс-процессных решений
  3. GlitchyThirdPartyComponent скорее всего использует COM (по внешнему виду), поэтому Thread.Abort это очень ненадежный вариант
  4. Хотя возможно использование другой сторонней библиотеки или запросить исправление у моего текущего поставщика библиотеки, эти решения требуют времени, и моя проблема должна быть решена как можно скорее

Итак, что мне делать в этой ситуации? Является 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
}
Другие вопросы по тегам