ホームページ >バックエンド開発 >C++ >C# で汎用タイムアウト メカニズムを実装するにはどうすればよいですか?

C# で汎用タイムアウト メカニズムを実装するにはどうすればよいですか?

Susan Sarandon
Susan Sarandonオリジナル
2025-01-23 12:21:10950ブラウズ

How Can I Implement a Generic Timeout Mechanism in C#?

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

プログラミングにおける一般的なニーズは、指定されたタイムアウトでコードを実行できるようにすることです。これは、完了までに時間がかかりすぎる可能性のある外部システムまたはコードを扱う場合に重要になります。共通のタイムアウト メカニズムを実装すると、コード ベース全体で一貫した動作が可能になり、応答しないコードが適切な方法で処理されるようになります。

この場合の目標は、指定されたタイムアウト内で任意のコードを実行できる汎用メソッドを作成することです。このソリューションでは、コードがタイムアウトを超えた状況を適切に処理し、その実行を停止するメカニズムを提供する必要があります。

これを実現するエレガントな方法は、デリゲートを使用することです。次のコード スニペットは、アクション デリゲートとミリ秒単位のタイムアウト値を受け入れる CallWithTimeout という名前の汎用タイムアウト メソッドを示しています。

<code class="language-csharp">static void CallWithTimeout(Action action, int timeoutMilliseconds)
{
    Thread threadToKill = null;
    Action wrappedAction = () =>
    {
        threadToKill = Thread.CurrentThread;
        try
        {
            action();
        }
        catch(ThreadAbortException ex){
           Thread.ResetAbort();// 取消强制中止,以便更好地完成。
        }
    };

    IAsyncResult result = wrappedAction.BeginInvoke(null, null);
    if (result.AsyncWaitHandle.WaitOne(timeoutMilliseconds))
    {
        wrappedAction.EndInvoke(result);
    }
    else
    {
        threadToKill.Abort();
        throw new TimeoutException();
    }
}</code>
このメソッドでは、指定された操作を実行するために別のスレッドが作成されます。実行を制御する鍵は、スレッドへの参照をキャプチャするラッピング デリゲートを使用することです。操作がタイムアウトを超えると、スレッドは正常に終了され、TimeoutException がスローされます。

このユニバーサル タイムアウト メカニズムを使用すると、開発者は応答しない外部システムやコード ブロックからコードを簡単に保護できます。これにより、アプリケーションの堅牢な動作が促進され、潜在的な例外の処理が強化されます。

以上がC# で汎用タイムアウト メカニズムを実装するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。