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() を使用してこれを行います。ただし、スレッドが実行され続けることを許可したいのですが、どうにかして、スレッドがそれほど多くのプロセッサ時間を使用しないようにします。
ここでの問題は、Jurassic コード内の CallGlobalFunction() メソッド内で無限ループが発生しているため、スレッドがこの状態になるとコードを実行できないことです。ループに Thread.Yield() を追加することはできません。ジュラ紀のコードをハッキングして、できる方法がないかどうかを簡単に検討しましたが、それは非常に困難であり、おそらく不可能です.
これまでにスレッドと対話できた唯一の方法は、上記の Thread.Abort() と非推奨の Thread.Suspend() を使用することです。
メソッドの実行中にスレッドを生成する方法はありますか、それとも強制終了する必要がありますか?
助けてくれてありがとう。これが理にかなっていることを願っています、
サム。
追加情報:
スレッドを維持することに関心があるのは、スクリプトを作成したユーザーとそれを実行しているユーザーが同じではない可能性があるためです。スレッドを実行しているユーザーのエクスペリエンスをできるだけスムーズに保ちたいと考えています。 . また、1 つの JavaScript 関数が長時間実行される正当な状況もあるかもしれませんが、それを停止したくはありません。リソースを独り占めするのをやめたいだけです。
アプリケーションがリソースを集中的に使用しているとユーザーに誤解させたくないため、スレッドを停止してシステムの速度を低下させないようにするソリューションは、依然として高い CPU 使用率を示しているため、好ましくありません。