ユーザーが作成した 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