2012-04-05 5 views
1

SQL Serverデータベースのテーブルを使用してジョブをスケジュールする大規模なアプリケーションを検討してください テーブルの各行には、queueID、methodNameなどのメタデータがタグ付けされています。 methodNameは、ネイティブドットネットインターフェイス、レガシーcomローカルインターフェイス、 サードパーティのCOMインターフェイスまたはサードパーティのWebサービスへのURIです。タスク並列ライブラリスレッドの中止/割り込み

現在、各queueIDを処理する32ビットのバックグラウンドexeファミリがあります。 各ジョブを実行できる時間の上限にqueueIDを設定した場合、制限時間を超過するとウォッチドッグは プロセスを終了します。

これを64ビット環境に移動する&複数のバックグラウンドexeプロセス を単一のマルチスレッドWindowsサービスに統合します。

問題は、設定された制限時間を超えるジョブの強制終了をどのように処理するかです。 単一のappDomainプライマリスレッドからタスク並列ライブラリからキューIDごとにタスクを割り当てた場合スレッドがcomインタフェースを実行する可能性があること、または サードパーティのWebサービスが実行される可能性があるため、明らかにnet4.0取り消しトークンは使用できません。 appDomain watchdogタスクがThread.abort()を呼び出すと、appDomain &がすべてのタスクスレッドを破損する可能性があります。Thread.Interrupt()がappDomainの破損がないスレッドを確実にキャンセルするかどうかは不明です。

時間制限を超えたスレッドを強制終了するには、どのような方法がありますか?

OR

はその後myAppDomain1.ExecuteAssembly( "queueProcess.exe arg1の") myAppDomain2.ExecuteAssembly( "queueProcess.exeのARG2") を を行う私たちは、各キューIDのためのAppDomainを作成するサービスを持っています。.. 現在存在するほぼ同じアーチが存在するが、appDomainsを制御する勝利サービス および各queueProcess.exe &次に、queueplcess.exeの各小さなプールのセットでジョブを実行するtplスレッドプールを使用する&時計犬はちょうどAppDomainを実行しますか?プロセスが制限時間を超過すると を読み込みます

答えて

1

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

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

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

+0

うーん>あなたはのAppDomainをアンロードすると、安全管理された専用の作業については、<あなたは、ASPネットは、COMインターフェイスを介して非マネージド専用のコードを実行することができますし、それが殺されるOKらしいので、タスク「専用管理」よろしいですか? – user1240952

+0

comコードにあるスレッドを中止した場合、最初は何も起こりません。コールが復帰すると、アボートが発生します。これは、呼び出し側マネージコードがfinallyブロックを使用してすべてのネイティブリソースを破棄することを知っている場合は安全です。ある意味では、これは中止されたマネージコードからの協力を必要とします。 ASP.NETは実際にここでいくつかのリスクを冒しています。ネイティブリソースが適切にリリースされるようにコードを監査できますか?はいの場合は、これを安全に行うことができます。 – usr

関連する問題