6

これが状況です。私はコード戦争コンテストのフレームワークを書いています。コードが実行されると、ターンごとに、各競技者が提供するライブラリ内のメソッドが呼び出されます。コンテストのルールは、メソッドが1秒以内に戻る必要があるか、メソッドを呼び出すタスクを強制終了することです。次に、そのターンのデフォルトの結果を使用します。

呼び出されたコードがキャンセルに応答することを信頼できないため、このメソッドはキャンセルをサポートしていません。また、スレッドを強制終了する必要があります。これは、無視されたバックグラウンドタスクが10または20ある場合、今後のすべての呼び出しで提供される各呼び出しのクロックサイクルが少なくなり、以前は1秒未満であったメソッドの方が時間がかかるためです。

プラス面として、私たちが殺しているメソッドは、リソースが開いていないなどの必要があります。したがって、中止しても何もハングしたままになることはありません。

更新:ここで覚えておくべき2つのこと。まず、これはゲームのようなものなので、パフォーマンスが重要です。次に、ワーカースレッドでリソースが開かれている可能性はほとんどありません。呼び出されたメソッドの1つが長すぎる場合は、それを中止してすぐに先に進む必要があります。

4

3 に答える 3

2

各競技者は、権限の低い独自の AppDomain で実行する必要があります。これにはいくつかの利点があります。

  1. サンドボックス化されています
  2. プロセス内の他のコードと対話することはできません
  3. AppDomain の強制アンロードは比較的クリーンです。

AppDomain をアンロードするよりもスレッドを強制終了したい場合でも、各競技者を AppDomain に入れて分離します。

残念ながらThread.Abort十分ではありません。それでもfinally、必要なだけ時間がかかる句を実行します。

于 2011-08-13T23:08:57.340 に答える
1

Thread.Interrupt() メソッドはおそらくあなたが探しているものです。

MSDN のドキュメントにあるように、「このスレッドが現在、待機、スリープ、または参加状態でブロックされていない場合、次にブロックが開始されたときに中断されます。」

これはアボートではなく、実行中のスレッドが待機状態になると強制的に ThreadInterruptedException をスローします。

次に、タイムアウトのある別のスレッドでタイマーを使用して、スレッドが本当に終了したくないかどうかを確認できます。たとえば、30 秒以内にスレッドが終了を拒否した場合は、スレッドを中止できます。

于 2011-08-13T20:53:36.970 に答える
1

2 番目のプロセスでコードを実行し、それと通信するためのインターフェイスを慎重に定義して、応答を受け取らないようにすることをお勧めします。ほとんどのオペレーティング システムは、プロセスを強制終了した後に適切にクリーンアップするように設計されています。

通信に関しては、サーバー側で一貫性のない状態のままになる可能性が高いため、.NET リモート処理はおそらく避けるべきです。その他の選択肢: ソケット、名前付きパイプ、Web サービス。

于 2011-08-13T20:47:49.910 に答える