2

一部のハードウェアセンサー用のクローズドソースAPIがあり、そのセンサーのクエリに使用しています。APIは、C#相互運用機能を介して使用するDLLとして提供されます。APIの機能がブロックされています。通常はエラー値を返しますが、場合によっては返されないこともあります。

この状況を検出できる必要があり、その場合はブロックされたスレッドを強制終了します。これはC#でどのように行うことができますか?

それらが呼び出されているスレッドは、BackgroundWorkerを介して作成されます。関数を呼び出す前に設定し、戻ったときにリセットできる、関数呼び出しをブロックするための簡単なウォッチドッグを探しています。ただそこに座って、私が戻ってくるのを待つべきです。そうしないと、スレッドが強制終了され、1)APIが再び解放され、アプリケーションのスレッドがまだぶら下がっていないため、最終的に戻った場合に何かを実行します。2)再実行などの他の回復手段を実行できます。 APIを初期化して、引き続き使用します。

4

1 に答える 1

6

1つのアプローチは、API呼び出しの前にSystem.Threading.Timerを設定して、特定のタイムアウト間隔の後に起動し、呼び出しの完了後にタイマーを破棄することです。タイマーが起動すると、ThreadPoolスレッドで起動し、適切なアクションを実行して問題のあるスレッドを強制終了できます。

アンマネージコードでブロックされている場合、.NETのThread.Abort()は機能しないため、Win32TerminateThreadAPIをP/Invokeする必要があることに注意してください。

また、終了したスレッドが同期オブジェクトを保持している、共有メモリの状態を変更している、またはその他の重要な操作を行っている可能性があるため、スレッドを強制的に強制終了した後、プロセスが安全な状態になる可能性は非常に低いことに注意してください。それを終了した結果、他のスレッドがハングしたり、プロセスがクラッシュしたり、データが破損したり、犬と猫が一緒に暮らし始めたりする可能性があります。何が起こるかを確信する方法はありませんが、それは悪いことになる可能性があります。可能であれば、最も安全なアプローチは、APIの使用を、リモートチャネルを介して通信する別のプロセスに分離することです。次に、プロセスを強制終了する方がスレッドを強制終了するよりもはるかに安全であるため、その外部プロセスをオンデマンドで強制終了できます。

于 2011-08-12T21:49:44.557 に答える