2015-11-25 2 views
1

У нас есть обработчик C# ASHX, который вызывает неуправляемую библиотеку C с помощью [DllImport].Бесконечная петля - выполнение ASP.NET не синхронизировано

В некоторых случаях неуправляемая библиотека C застревала в бесконечном цикле, однако ASP.NET не прерывает ее, в результате чего WorkerProcess w3wp.exe потребляет 100% процессорное ядро ​​бесконечно.

В другом простом тестовом примере, где мы добавляем бесконечный цикл C# (while (true) {}) внутри обработчика C# ASHX, IIS завершает выполнение, как ожидалось.

Похоже, что IIS не принимает во внимание выполнение неуправляемого кода через [DllImport] в свою логику executeTimeout.

Это по дизайну? Как нам обойти это, чтобы IIS прекратил выполнение?

+0

IFAIK ASP.Net использует Thread.Abort для завершения запросов, и этот метод работает только для управляемого кода –

ответ

0

Итак, в настоящий момент мы фактически уничтожаем оскорбительную нить (а не процесс) напрямую, проверяя, потребляет ли этот поток слишком много ресурсов.

1

Единственный хороший способ прервать неуправляемый код - запустить его в отдельном процессе и убить его с помощью Process.Kill().

+0

, возможно, придется спуститься по этому методу ... – user5133888

0

Поскольку у вас есть неуправляемый код, вы должны положить его в управляемый контейнер, который correctly implements IDisposable. Внутри контейнера вы можете контролировать жизненный цикл задачи, ссылаясь на неуправляемый метод, например. убейте его после определенного таймаута.

+0

Интересная идея, мы дадим ей быстрый тест. Благодаря!! – user5133888

+0

, поскольку поток выполняется в threadpool, нет простого способа его убить, неуправляемый поток должен проверить, было ли запрошено завершение – user5133888

+0

@ user5133888: Если вы хотите контролировать жизненный цикл потока, t запустить его через 'ThreadPool'. Вместо этого используйте 'Task ' или 'Thread'. –

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