ホームページ > バックエンド開発 > C++ > プロセスの長時間実行を防ぐために、一般的なタイムアウト メカニズムを C# に実装するにはどうすればよいですか?

プロセスの長時間実行を防ぐために、一般的なタイムアウト メカニズムを C# に実装するにはどうすればよいですか?

DDD
リリース: 2025-01-23 12:11:13
オリジナル
257 人が閲覧しました

How Can I Implement a Generic Timeout Mechanism in C# to Prevent Long-Running Processes?

C# でのユニバーサル タイムアウト メカニズムの実装

プログラミングでは、長時間実行されるプロセスによってアプリケーションがブロックされたり停滞したりするのを防ぐために、コードの実行に時間制限を設定することが必要になることがよくあります。このため、共通かつ効果的なタイムアウト メカニズムを実装することが重要です。

通常は 30 秒で完了するメソッドがあるが、1 分を超えた場合にその実行を終了したいとします。特定のメソッドのタイムアウトをハードコーディングせずにこれを実現するにはどうすればよいですか?

幸いなことに、C# は一般的なタイムアウト実装方法を通じてソリューションを提供します。実際の例を見てみましょう。

タイムアウトメカニズム

私たちの目標は、指定されたタイムアウト内に 1 行のコードまたは匿名デリゲートを実行する CallWithTimeout という名前のメソッドを作成することです。タイムアウトになった場合は、デリゲートの実行を停止し、TimeoutException 例外をスローする必要があります。

実装の詳細

重要な課題は、タイムアウト後にデリゲートの実行を終了することです。これは、デリゲートのラッピングとスレッド操作を巧みに使用することで実現されます。

  1. ラッパー デリゲート: デリゲートの実行スレッドをローカル変数にキャプチャするラッパー デリゲートを作成します。これはデリゲートを作成するメソッドで行われます。
  2. 非同期実行: ラッパー デリゲートが引数として BeginInvoke に渡され、非同期実行が開始されます。返された IAsyncResult オブジェクトの AsyncWaitHandle プロパティは、デリゲートがタイムアウト内に完了したかどうかを確認するために使用されます。
  3. タイムアウト処理: タイムアウト前にデリゲートが完了した場合、EndInvoke が呼び出されて実行が完了します。ただし、タイムアウトが発生した場合、AsyncWaitHandle はデリゲートがまだ実行中であることを示す false を返します。この場合、threadToKill.Abort() は実行スレッドを終了するために使用されます。
  4. スレッドのキャンセル: スレッドの中止は catch ブロックによって捕捉され、デリゲートが途中で終了したことを示すために ThreadAbortException がスローされます。

使用法

事前定義された時間枠内で特定のコードが確実に実行されるようにする必要がある場合は、いつでもコード内の複数の場所で CallWithTimeout メソッドを使用できます。デリゲートとタイムアウトをパラメーターとして渡すことで、時間指定された操作を簡単に構成して実行できます。

結論

C# で共通のタイムアウト メカニズムを実装すると、デリゲートとスレッドの実行時間を効果的に制御できます。提供された例は、長時間実行されるタスクを終了する機能を含む、強力で洗練されたソリューションを示しています。このアプローチは、デッドロックを防止し、アプリケーションの応答性とパフォーマンスを維持するのに役立ちます。

以上がプロセスの長時間実行を防ぐために、一般的なタイムアウト メカニズムを C# に実装するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート