2

ユーザーが作成した DLL を動的にロードして実行するアプリケーションがあります。タイマーで実行され、どの「ルール」(dll) を実行するかをチェックするスケジューリング エンジンがあります。各ルールは、以下を使用して独自のスレッドで開始されます。

private void OnTimer(...)
{
   timer.stop();
   ...
   foreach(RuleData ruleData in RulesToRun)
      ThreadPool.QueueUserWorkItem(new System.Threading.WaitCallback(ExecuteRule), ruleData);
   _asyncOpsAreDone.WaitOne();
   timer.start();
}

非同期操作が完了すると、プログラムはスケジューリング タイマーが作動するのを待機し、別のループを実行します。

問題は、実行に時間がかかる dll をユーザーが作成する場合があることです。

  • 待つ場合:これにより、次のタイマーティックが延期されます(実行中に停止し、後で再開されるため)
  • 待てない場合: アプリケーション ユーザーのプールを完成させて、並行して実行されている不明な数のルールを探しています。

1 つのルールの実行がハングする可能性があることを考慮すると、私の選択は次のいずれかです。Synch - すべてのルールをハングするか、Asynch - リソース プールを乾燥させます。

ルールの実行にタイムアウトを与えることを真剣に考えましたが、.Abort() はあまり普及していませ ん。

また、タスクのキャンセルのための並列プログラミング ソリューションには、"ThrowIfCancellationRequested();" の記述が含まれます。dllの実行中(ソースコードはありません) http://msdn.microsoft.com/en-us/library/dd997396.aspx

4

1 に答える 1

0

「sgorozco」による 3 番目のコメントが最も役に立ちました。ルールを非同期で実行し続けることを選択しましたが、この方法で既に処理中のものはスキップします。

  • 正しく書かれている他のルールに間に合うように仕事を終わらせてください。

  • スタックしているジョブをスキップします。

  • スレッドを強制終了して、破損したメモリ ガベージを残すことは避けてください。

于 2012-08-11T20:52:55.860 に答える