我正在使用一个名为Jurassic的 .Net JavaScript 实现在我用 VB.Net 编码的 .Net 4 WPF 应用程序中运行用户控制的脚本 - 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 函数会运行很长时间的合法情况,我不想杀死它,我只想停止被允许占用资源。
涉及停止线程以降低系统速度但仍显示高 CPU 使用率的解决方案并不可取,因为我不希望用户错误地认为应用程序是资源密集型的。