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

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

Barbara Streisand
Barbara Streisandオリジナル
2025-01-23 12:06:17973ブラウズ

How Can I Implement a Generic Timeout for a Single Line of Code in C#?

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

質問:

指定されたタイムアウト内で 1 行のコードを実行する汎用メソッドを C# で作成するにはどうすればよいですか?これは、変更できないため問題が発生する可能性があるコードを操作する場合や、タイムアウトでコードの実行を終了する場合に便利です。

答え:

汎用タイムアウト ハンドラーの実装には、特にタイムアウト後に問題のあるコードを停止するという点で、慎重な検討が必要です。次のソリューションは、ラムダ式とスレッドを組み合わせたものです。

キー メソッドは CallWithTimeout で、実行するコード (Action デリゲート) とミリ秒単位の希望のタイムアウトを受け取ります。

実装:

<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>

使用法:

CallWithTimeout メソッドは次のように使用できます:

<code class="language-csharp">    static void Main(string[] args)
    {
        // 调用一个执行时间为5秒的方法,设置6秒的超时时间
        CallWithTimeout(FiveSecondMethod, 6000);

        // 调用同一个方法,设置4秒的超时时间,这将触发超时异常
        CallWithTimeout(FiveSecondMethod, 4000);
    }

    static void FiveSecondMethod()
    {
        Thread.Sleep(5000);
    }</code>

この例では、FiveSecondMethod は 6 秒のタイムアウト以内に正常に実行されますが、4 秒のタイムアウト以内に TimeoutException 例外をスローします。

注:

上記のコードは、スレッドを中止することでタイムアウト スレッドをキャンセルしますが、これは場合によっては理想的ではない可能性があります。より洗練されたキャンセル方法が必要な場合は、他のメカニズムを実装できます。

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

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