Возможно ли дать / уснуть / задушить другой поток, пока он выполняет метод во внешней библиотеке - в частности, в юрском периоде?

Я использую 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, Таким образом, он не отнимает ресурсы у системы.

Другие вопросы по тегам