C# でのユニバーサル タイムアウト メカニズムの実装
プログラミングでは、長時間実行されるプロセスによってアプリケーションがブロックされたり停滞したりするのを防ぐために、コードの実行に時間制限を設定することが必要になることがよくあります。このため、共通かつ効果的なタイムアウト メカニズムを実装することが重要です。
通常は 30 秒で完了するメソッドがあるが、1 分を超えた場合にその実行を終了したいとします。特定のメソッドのタイムアウトをハードコーディングせずにこれを実現するにはどうすればよいですか?
幸いなことに、C# は一般的なタイムアウト実装方法を通じてソリューションを提供します。実際の例を見てみましょう。
タイムアウトメカニズム
私たちの目標は、指定されたタイムアウト内に 1 行のコードまたは匿名デリゲートを実行する CallWithTimeout
という名前のメソッドを作成することです。タイムアウトになった場合は、デリゲートの実行を停止し、TimeoutException
例外をスローする必要があります。
実装の詳細
重要な課題は、タイムアウト後にデリゲートの実行を終了することです。これは、デリゲートのラッピングとスレッド操作を巧みに使用することで実現されます。
BeginInvoke
に渡され、非同期実行が開始されます。返された IAsyncResult
オブジェクトの AsyncWaitHandle
プロパティは、デリゲートがタイムアウト内に完了したかどうかを確認するために使用されます。 EndInvoke
が呼び出されて実行が完了します。ただし、タイムアウトが発生した場合、AsyncWaitHandle
はデリゲートがまだ実行中であることを示す false
を返します。この場合、threadToKill.Abort()
は実行スレッドを終了するために使用されます。 catch
ブロックによって捕捉され、デリゲートが途中で終了したことを示すために ThreadAbortException
がスローされます。 使用法
事前定義された時間枠内で特定のコードが確実に実行されるようにする必要がある場合は、いつでもコード内の複数の場所で CallWithTimeout
メソッドを使用できます。デリゲートとタイムアウトをパラメーターとして渡すことで、時間指定された操作を簡単に構成して実行できます。
結論
C# で共通のタイムアウト メカニズムを実装すると、デリゲートとスレッドの実行時間を効果的に制御できます。提供された例は、長時間実行されるタスクを終了する機能を含む、強力で洗練されたソリューションを示しています。このアプローチは、デッドロックを防止し、アプリケーションの応答性とパフォーマンスを維持するのに役立ちます。
以上がプロセスの長時間実行を防ぐために、一般的なタイムアウト メカニズムを C# に実装するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。