.net 当另一个线程在外部库中执行方法时,是否可能产生/休眠/限制另一个线程-特别是Jurassic?
我正在使用一个名为.NETJavaScript的实现,在我的.NET4WPF应用程序中运行用户控制的脚本,该应用程序用VB.Net-C编码,答案很好。脚本引擎在自己的线程上运行,并为脚本提供一个API,以便与我的应用程序交互。在用户执行一个导致无限循环并取出处理器核心的脚本之前,这一切都非常有效 在线程中运行的方法类似于以下内容,但具有更多不相关的位:.net 当另一个线程在外部库中执行方法时,是否可能产生/休眠/限制另一个线程-特别是Jurassic?,.net,wpf,vb.net,multithreading,jurassic,.net,Wpf,Vb.net,Multithreading,Jurassic,我正在使用一个名为.NETJavaScript的实现,在我的.NET4WPF应用程序中运行用户控制的脚本,该应用程序用VB.Net-C编码,答案很好。脚本引擎在自己的线程上运行,并为脚本提供一个API,以便与我的应用程序交互。在用户执行一个导致无限循环并取出处理器核心的脚本之前,这一切都非常有效 在线程中运行的方法类似于以下内容,但具有更多不相关的位: Sub run() Do While True Try Do Until queue.Co
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()执行此操作。然而,我更愿意允许线程继续运行,但以某种方式防止它占用如此多的处理器时间
这里的问题是,一旦线程处于这种状态,我就无法在其上运行任何代码,因为无限循环发生在Jurassic代码中的CallGlobalFunction()方法中,因此我不能只将thread.Yield()添加到循环中。我曾短暂地考虑过通过我的方式破解侏罗纪密码,看看是否有任何方法可以做到,但那将是非常困难的,而且很可能是不可能的
到目前为止,我能够与线程交互的唯一方法是使用上文所述的thread.Abort()和不推荐使用的thread.Suspend()
那么,在线程执行一个方法时,有没有办法生成一个线程,还是我必须杀死它
感谢您的帮助,我希望这是有意义的,山姆 额外信息:
我之所以关心保持线程处于活动状态,是因为编写脚本的用户和运行脚本的用户可能不同,我希望让运行线程的用户体验尽可能平滑。也可能存在一个合法的情况,在这种情况下,一个JavaScript函数会运行很长时间,我不想扼杀它,我只想停止被允许占用资源
涉及阻止线程减慢系统速度但仍显示高CPU使用率的解决方案并不可取,因为我不希望用户错误地认为应用程序是资源密集型的。我认为您应该将线程优先级设置为
最低。这样就不会占用系统的资源。我认为应该将线程优先级设置为最低。这样就不会占用系统的资源。谢谢你的回答,但是线程优先级已经是最低的,尽管它仍然可以为系统的其余部分提供资源,但一旦我有了与内核一样多的实例,然后风扇转速和电能使用率就可以保持100%的CPU使用率。这对于最终用户来说是不可接受的情况。您可以将进程放入Windows作业对象中,并设置最大CPU使用率百分比。这涉及到非托管API。我以前从未听说过这一点,我在很多地方都读过,不可能将CPU使用率限制在%以内,所以这听起来很有趣。我现在就读,谢谢。看起来CpuRate可以支持它。虽然它很好,但它是Windows 8及以上版本,这对我来说不是一个选项。我目前正试图弄清楚这是否能满足我的需要……感谢你的回答,不过线程优先级已经是最低的,尽管它仍然可以为系统的其余部分提供资源,但一旦我拥有了与内核一样多的实例,然后风扇转速和电源使用率就可以保持100%的CPU使用率。这对于最终用户来说是不可接受的情况。您可以将进程放入Windows作业对象中,并设置最大CPU使用率百分比。这涉及到非托管API。我以前从未听说过这一点,我在很多地方都读过,不可能将CPU使用率限制在%以内,所以这听起来很有趣。我现在就读,谢谢。看起来CpuRate可以支持它。虽然它很好,但它是Windows 8及以上版本,这对我来说不是一个选项。我目前正试图弄清楚这是否能满足我的需要……你能在有WorkerSupportsCancellation的后台工作人员中这样做吗?但我不认为你可以优先考虑后台工作人员。看来你的问题大多难以解决;现代浏览器有一个原因:要么选择它们认为已经无限的强制杀戮脚本,要么允许它们继续。我认为这对你的用户也很好:告诉他们似乎有什么不对劲,让他们决定怎么做。实际的解决方案是为用户提供一种简单的方法,提醒脚本作者他们的脚本可能有缺陷,然后确保更新可以轻松通过。我知道这并不理想,但为什么要放慢一个可能被破坏的脚本呢?杀了它吧。对不起,我不知怎么错过了这些评论。布拉姆:谢谢,但这不起作用,因为backgroundWorker上的cancelAsync方法不强制退出任何内容,它只设置了一个布尔属性,然后该方法需要检查,我无法控制该方法。德列夫:如果我不能解决其他问题,那么我可能会使用这种方法,但是我喜欢这样的想法,即能够非常快速地(在500毫秒左右)对潜在问题做出反应,并控制住它,然后给它一个表现自己的机会。除非我确定有问题,否则我不想终止工作。你能在有WorkersupportsScanCellation的后台工作人员中完成吗?但我不认为你可以优先考虑后台工作人员。看来你的问题大多难以解决;现代浏览器之所以流行是有原因的