2011-06-26 4 views
9

私はこの質問に類似した議論をいくつか見てきましたが、私が直面している問題に本当に答えるものは何もありません。.NETでのスレッドメモリ使用の高速チェックまたは制限?

私はソフトウェアの動作をインタプリタスクリプトでカスタマイズできるC#アプリケーションを開発中です。各スクリプトは、C#アプリの異なる子スレッド上で実行されています。 (私はスクリプトを実行するためにJintのjavascriptインタープリタを使用していますが、私の質問はスレッドが.NETアプリケーションで動的に動作する他の状況でも同様に有効です)。これまでのところ、これは素晴らしいことです。しかし、私はアプリケーションがそれ自身を動作させることを保証する必要があります。アプリケーションがヒープスペースを使い果たしてしまう可能性のある悪いスクリプトの場合は、あまりにも多くのメモリを食べているスレッドを検出して停止する必要があります。概念的には、これは、ページ上のjavascriptが実行に時間がかかりすぎるか、あまりにも多くのメモリを取っているかを判断するWebブラウザと同様に見える可能性があります。問題は、.NETでそうする方法があるかどうかを判断できなかったことです。

スレッドが利用できるメモリの量にハード制限を設けたり、親スレッドからスレッドのメモリ使用率をすばやく確認する方法はありますか?私は、スレッド内のスタックオーバーフロー、ヒープスペースには関係しません。

"明白な"解決策は、別々のスレッドではなく別々のプロセスに分割することですが、これらのスクリプトはソフトウェアの動作を変更するため、パフォーマンスが大幅に低下します。結合された。アプリケーションレベルの監視も、スクリプト自体が動作していない情報を提供しないため、理想的ではありません。また、スクリプトはビルド、テスト、再デプロイするのではなく、ソフトウェアの迅速な変更を可能にするため、デバッグのための遅いメソッドは機能しません。私は、あまりにも多くのメモリを食べているスレッドを検出するための合理的に速い方法を必要とするだけで、スクリプトを殺して無視することができます。

ありがとうございます!

+0

"私は、ソフトウェアの動作をインタプリタスクリプトでカスタマイズできるC#アプリケーションに取り組んでいます。各スクリプトはC#アプリケーションの異なる子スレッドで実行されています。"あなたがしているのは、アプリをカスタマイズすることだけです。なぜスクリプトは別のスレッドで実行する必要がありますか? –

+0

"これらのスクリプトはソフトウェアの動作を変更するため、密接に結合することを意図しているため - 私は単語をしっかりと結合したスクリプトを聞いて、私は設計について疑問に思う。 –

+0

メモリ使用量を制限したいと思えば別々のプロセスを使用する方がよいでしょう。いくつかのスクリプトの危険性がある場合は、ゲームをプレイしていないことを全く制御できません。とにかく、別のプロセスで実行されることを確認します。私はあなたがスレッドごとに必要な方法を制限することができないと確信していません。APIがあれば、それはWindows APIになります。私が知る限り、マネージスレッドとウィンドウスレッドをマップすることはできません。あらゆる用途に使用することができます。 – InBetween

答えて

0

WMIは1つのオプションです。プロセスメモリの使用状況を監視できることは確かです。しかし、あなたはこの考えをもっと探求することができます。

Here is small intro to WMI in C#。あなたが照会することができる一連のクラスがあります。また、ローカルマシンの統計情報を照会するために、非常に高価になることはありません。しかし、私は最初にいくつかのパフォーマンス番号を取ることをお勧めします。

+0

このアプローチの問題は、マネージスレッドとウィンドウスレッドの間に1対1の関係がないことです。 – InBetween

3

他のポスターが示唆するように、別のプロセスでホストするほうが簡単かもしれません。わずかに軽量のアプローチは、別のアプリドメインでホストし、app-domain resource monitoring apiを使用してメモリ使用量を監視することです。

関連する問題