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

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

Susan Sarandon
リリース: 2025-01-23 12:01:12
オリジナル
975 人が閲覧しました

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

C# ユニバーサル コード実行タイムアウト メカニズム: 完全ガイド

ソフトウェア開発では、コード ブロックの実行時間を制御することが重要です。特に、API 呼び出しやデータベース クエリなど、信頼性が低く時間のかかる外部依存関係を扱う場合には重要です。これを行うには、単一行のコードにタイムアウトを設定する一般的な方法が必要です。

ユニバーサル タイムアウト メカニズムを実装します

ユニバーサル タイムアウト メカニズムの構築の中核は、長時間実行されるコードを終了し、発生する可能性のあるエラーを阻止することです。このために、階層化されたソリューションを採用できます:

  • ラップされたデリゲート: ターゲット コードをキャプチャし、スレッド ハンドルへのアクセスを提供するデリゲートを作成します。
  • タイムアウト実行メソッド: 操作とタイムアウト期間を入力として受け取るメソッド (CallWithTimeout など) を作成します。このメソッドは、別のスレッドでコードの実行を開始し、進行状況を追跡するためにラッピング デリゲートをアタッチします。
  • スレッド終了: タイムアウトになると、長時間実行されるコードを担当するスレッドを終了し、TimeoutException をスローします。

実際の操作

具体的な実装の詳細は次のとおりです:

<code class="language-csharp">class Program
{
    static void Main(string[] args)
    {
        // 设置 6000 毫秒(6 秒)的超时
        CallWithTimeout(FiveSecondMethod, 6000);

        // 设置 4000 毫秒(4 秒)的超时
        CallWithTimeout(FiveSecondMethod, 4000);
    }

    static void FiveSecondMethod()
    {
        Thread.Sleep(5000);
    }
}

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>
ログイン後にコピー

この実装により、実行に対する柔軟性と洗練された制御を提供しながら、明確に定義されたタイムアウトでコードを実行できます。

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

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