首頁 > 後端開發 > C++ > 如何在 C# 中實作單行程式碼的通用逾時?

如何在 C# 中實作單行程式碼的通用逾時?

Barbara Streisand
發布: 2025-01-23 12:06:17
原創
971 人瀏覽過

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

在C#中實作通用的程式碼超時機制

問題:

如何在C#中建立一個通用的方法,以便在給定逾時時間內執行單行程式碼?這對於處理那些無法修改且可能出現問題的程式碼非常有用,並且能夠在逾時時終止程式碼執行。

答案:

實作通用的超時處理程序需要仔細考慮,尤其是在逾時後停止問題程式碼方面。以下解決方案結合了lambda表達式和線程處理。

關鍵方法是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# 中實作單行程式碼的通用逾時?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板