SQL Serverデータベースのテーブルを使用してジョブをスケジュールする大規模なアプリケーションについて考えてみます。テーブルの各行は、queueID、methodName、およびその他のメタデータでタグ付けされています。methodNameは、ネイティブドットネットインターフェイス、レガシーcomローカルインターフェイス、サードパーティcomインターフェイス、またはサードパーティWebサービスへのURIの場合があります。
現在、各queueIDを処理する32ビットのバックグラウンドexeのファミリがあります。各ジョブを実行できる時間には、queueIDによって設定された最大時間制限が設定されています。時間制限を超えると、ウォッチドッグはプロセスを強制終了します。
これを64ビット環境に移行し、複数のバックグラウンドexeプロセスを単一のマルチスレッドWindowsサービスに統合したいと考えています。
問題は、設定された制限時間を超えるジョブの強制終了をどのように処理するかです。単一のappDomainプライマリスレッドのタスク並列ライブラリから各queueIDにタスクを割り当てる場合、スレッドがcomインターフェイスまたはサードパーティのWebサービスを実行する可能性があるため、明らかにnet4.0キャンセルトークンは使用できません。appDomainウォッチドッグタスクがThread.abort()を呼び出すと、appDomain全体が破損し、すべてのタスクスレッドが破棄される可能性があります。Thread.Interrupt()がappDomainを破損せずにスレッドを確実にキャンセルするかどうかはわかりません。
では、制限時間を超えたスレッドを強制終了するために提案された手法は何ですか?
また
サービスに各queueIDのAppDomainを作成させてから、myAppDomain1.ExecuteAssembly( "queueProcess.exe arg1")myAppDomain2.ExecuteAssembly( "queueProcess.exe arg2")...現在存在するものとほぼ同じアーチを実行しますか? appDomainsと各queueProcess.exeを制御し、tplスレッドプールを使用するサービスは、各queueProcess.exeの小さなプールのセットでジョブを実行し、ウォッチドッグはAppDomainを実行しますか?プロセスが時間を超えたときにアンロードします制限