1

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を実行しますか?プロセスが時間を超えたときにアンロードします制限

4

1 に答える 1

1

任意のネイティブコードを呼び出して、正常にシャットダウンさせることはできません。そのスレッドを強制終了すると(CreateThreadを使用してそのスレッドを開始した場合に可能です)、通常、メモリがリークし、データが破損し、ロックが解放されず、ファイルハンドルが開いたままになります。これは協力なしでは機能しません。プロセスはいつでもきれいに殺すことができるので、これを処理する正しい方法です。

管理専用タスクの場合、appdomainをアンロードしても安全です(ASP.NETはそのように実行します)。グローバル構造が一貫性のない状態のままになっている可能性があるため、スレッドを中止しないでください。または、静的ctorを中止して、クラス全体を永久に使用できなくすることもできます(静的ctorは再起動できません)。

名前付きパイプを介して入力を受け取り、タスクを実行する汎用ホストプロセスを作成できます。このようなプロセスは軽量にすることができます。あなたはいつでもそれを殺すことができます。

于 2012-04-05T23:05:44.650 に答える