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

如何在 C# 中實現程式碼執行的通用逾時機制?

Susan Sarandon
Susan Sarandon原創
2025-01-23 12:01:12985瀏覽

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

C# 通用程式碼執行逾時機制:完整指南

在軟體開發中,控製程式碼區塊執行時間至關重要,尤其在處理不可靠或耗時的外部相依性(如 API 呼叫或資料庫查詢)時。為此,需要一種通用的方法來為單行程式碼設定逾時。

實作通用超時機制

建構通用逾時機制的核心在於終止長時間運行的程式碼並攔截可能出現的錯誤。為此,我們可以採用分層解:

  • 包裝委託 (Wrapped Delegate): 建立一個委託來捕獲目標程式碼,並提供對執行緒句柄的存取。
  • 超時執行方法 (Timeout Execution Method): 建立一個方法(例如 CallWithTimeout),它接收一個操作和超時持續時間作為輸入。此方法在單獨的執行緒上啟動程式碼執行,並附加包裝委託來追蹤進度。
  • 執行緒終止 (Thread Termination): 逾時時,中止負責長時間運行程式碼的執行緒並拋出 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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn