1

これは私の質問です:

メソッド実行のタイムアウトをどのように処理できますか。シナリオは次のとおりです。

C#.Net Framework4.0Windowsサービスアプリケーションがあります。(特定の会社の特定のソフトウェアの)外部COMアセンブリへの参照を追加しました。このアセンブリでは、Windowsサービス上のサードパーティソフトウェアに対していくつかの情報を処理し、X分ごとにそのタスクを繰り返すことを意図していました(ユーザーが定義)。これは完璧なシナリオでうまく機能します。問題は、サードパーティソフトウェアに問題があり、アセンブリが応答せず、Windowsサービスが応答なしでその実行でスタックする場合です。たとえば、これはその実行のコードです。

    var calObj = new CAL.Object(CalOperatins.SendNoSavingChanges);
//this SYNC execution method sometimes get stuck and 
//the rest of the program just doesn't executes
calObj.TerminateUserSession();

log.Log4Text(string.Format("Service cycle ended, waiting {0} for next execution.",paramTime));
}

コードのコメントで述べたように、TerminateUserSessionの実行は同期的であり、そのソフトウェアが何らかの問題を実験すると、サービスがそこでスタックし、Log4Textメソッド(およびその下のすべて)が実行されません。

それは外部アセンブリであり、そのコードを変更できないことを念頭に置いて、そのTerminateUserSessionメソッド実行のタイムアウトを処理できる方法はありますか?(はい、タイムアウトがないためにプログラムが間違っていることがわかります)

前もって感謝します。

4

1 に答える 1

3

ハンドルを持っているスレッドでそのコードを実行するのはどうですか。ブール値を前後に切り替えることで実行の成功を追跡し、指定されたタイムアウトまでに応答しない場合はスレッドを強制終了できます。スレッドを強制終了した後、再起動できます。ただし、これは完全な解決策ではありません。スレッドを強制終了するときに COM オブジェクトを再作成する必要があり、常に時間がかかりすぎるようです。

これは、COM オブジェクトで何が起こっているか、および TerminateUserSessions メソッドがその効果を処理できるかどうかにも左右されます。

于 2011-08-05T13:41:49.993 に答える