Возможно ли дать / уснуть / задушить другой поток, пока он выполняет метод во внешней библиотеке - в частности, в юрском периоде?
Я использую JavaScript-реализацию.Net под названием Jurassic для запуска пользовательских сценариев внутри моего WPF-приложения.Net 4, закодированного в VB.Net - ответы C# хороши. Механизм сценариев работает в своем собственном потоке и предоставляет API для взаимодействия сценария с моим приложением. Все это работает очень хорошо, пока пользователь не выполнит сценарий, который вызывает бесконечный цикл и вынимает ядро процессора.
Метод, который выполняется в потоке, выглядит примерно так, но с более несущественными битами:
Sub run()
Do While True
Try
Do Until queue.Count = 0
Dim functionName As String = queue(queue.Count - 1)
queue.RemoveAt(queue.Count - 1)
scriptEngine.CallGlobalFunction(functionName)
Loop
thread.Sleep(Timeout.Infinite)
Catch ex As ThreadInterruptedException
' Wake and loop
Catch ex As Exception
' Log
End Try
Loop
End Sub
У меня есть класс мониторинга в другом потоке, который обнаруживает потоки обработчика сценариев, которые используют много ресурсов, отмечая, когда они просыпаются и спят, и отмечая те, которые работают слишком долго.
Как только поток был отмечен классом мониторинга, я немного застрял. В настоящее время я объясняю ситуацию пользователям и даю им возможность прекратить поток. Я делаю это с помощью Thread.Abort(). Тем не менее, я бы предпочел, чтобы поток продолжал работать, но каким-то образом не позволял бы ему использовать столько процессорного времени.
Проблема здесь в том, что я не могу запустить какой-либо код в потоке, когда он находится в этом состоянии, поскольку бесконечный цикл происходит в методе CallGlobalFunction() в коде юрского периода, поэтому я не могу просто добавить Thread.Yield() в цикл. Я кратко подумал о том, чтобы взломать свой путь через юрский код, чтобы посмотреть, есть ли какой-нибудь способ, которым я могу, но это было бы очень сложно и, возможно, невозможно.
До сих пор я только мог взаимодействовать с потоком, используя Thread.Abort (), как указано выше, и устаревший Thread.Suspend().
Так есть ли способ выдать поток, пока он выполняет метод, или мне просто придется его убить?
Спасибо за любую помощь, и я надеюсь, что это имеет смысл,
Сэм.
Дополнительная информация:
Причина, по которой я забочусь о поддержании потока в том, что пользователь, который написал скрипт, и пользователь, который его запускает, могут не совпадать, и я хочу, чтобы пользователь работал как можно более гладко, когда пользователь запускает поток. Также могут быть допустимые ситуации, в которых одна функция JavaScript будет работать долгое время, и я не хочу это убивать, я просто хочу перестать позволять собирать ресурсы.
Решения, которые включают остановку потока от замедления системы, но все еще демонстрируют высокую загрузку ЦП, не являются предпочтительными, потому что я не хочу, чтобы пользователь ошибочно чувствовал, что приложение является ресурсоемким.
1 ответ
Я думаю, что вы должны установить приоритет потока Lowest
, Таким образом, он не отнимает ресурсы у системы.