2016-03-31 4 views
1

У меня есть сайт ASP.NET (C#), который использует стороннюю DLL для обработки данных, которые пользователи POST через веб-форму. Вызов довольно прост:Обнаружение 100% загрузки процессора по ссылке библиотеки

string result = ThirdPartyLib.ProcessData(myString); 

Однажды в голубой луны эта библиотека зависания и (по моим бревнами хостинг-провайдер) потребляет 100% CPU. Веб-сайт размещен на общем хостинге, поэтому я не имею доступа к журналам IIS или журналам событий. Когда это произойдет, мой сайт автоматически останавливается на мониторе производительности хостинг-провайдера, и я снова включил его.

Теперь я знаю, что правильная вещь для этого - это исследование проблемы и исправление (или замена) DLL. Но поскольку это стороннее программное обеспечение, я не могу его исправить, и их поддержка вообще не помогает. Более того, я не могу воспроизвести проблему. Замена библиотеки - тоже боль.

Есть ли способ в C#, чтобы определить, когда эта DLL начинает потреблять 100% -ый CPU и автоматически убить процесс из моего кода ASP.NET?

+0

является 'ThirdPartLib.ProcessData (myString)' Вы знаете, что подкласс метода/класса является публичным классом или статическим классом.? есть ли проблемы с размещением .. можете ли вы иметь стороннюю отладку/исправить код ..? можете ли вы также показать, как вы потребляете/создаете экземпляр объекта класса 3-й части.? – MethodMan

+0

@MethodMan, 'это публичный класс или статический класс ..?' Это публичный нестатический класс, который имеет единственный без параметров ctor и единственный метод, который мне нужно вызвать. 'Есть ли проблемы с размещением' 'lib '' не выставлять никаких классов IDisposable. 'у вас есть сторонняя отладка/исправление кода ...? Ответ гораздо ближе к« нет », чем к« да ». Если бы я мог исправить, я бы, очевидно, использовал его. 'можете ли вы также показать, как вы потребляете/создаете экземпляр экземпляра? На самом деле ничего не показывать. Публичные методы lib очевидны, и нет никакого способа их неправильного использования. –

ответ

1

Вы не можете «обнаружить», если текущий процесс висит, потому что, как вызывающий метод (сторонний или нет), вы просто не управляете, пока не вернетесь.

Что вы можете сделать, это перевести вызов в стороннюю библиотеку в отдельный исполняемый файл и вывести его результат через стандартный вывод (для этого вы можете просто использовать Console.WriteLine(string)).

После того, как вы сделали это, вы можете создать отдельный Process, который работает этот исполняемый файл, прочитать результат через StandardOutput и использовать WaitForExit(int) ждать определенное количество времени (возможно, несколько секунд) для завершения процесса. Возвращаемое значение WaitForExit() сообщает вам, действительно ли процесс вышел. Если это не так, вы можете это сделать и продолжить работу без рабочего процесса IIS в целом.

Смежные вопросы