首頁 >後端開發 >C++ >如何在C#超時後取消任務。Wait()?

如何在C#超時後取消任務。Wait()?

Mary-Kate Olsen
Mary-Kate Olsen原創
2025-01-27 22:16:13578瀏覽

How to Cancel a Task.Wait() After a Timeout in C#?

超時取消C#中Task.Wait()的方法

這段程式碼中,MessageLoopWorker.Run 在一個帶有訊息泵的新執行緒上啟動,並在該執行緒上執行 DoWorkAsync 任務。然後在主執行緒上等待該任務,阻塞主執行緒直到任務完成。

為了在超時後取消任務,可以使用 CancellationToken 類別。 CancellationToken 類別允許您將取消請求從一個執行緒傳播到另一個執行緒。

以下是修改程式碼以在超時後取消任務的方法:

<code class="language-csharp">private Uri GetFinalUrl(PortalMerchant portalMerchant)
{
    SetBrowserFeatureControl();
    Uri finalUri = null;
    if (string.IsNullOrEmpty(portalMerchant.Url))
    {
        return null;
    }
    Uri trackingUrl = new Uri(portalMerchant.Url);

    // 创建一个 CancellationTokenSource。
    using (CancellationTokenSource cancellationTokenSource = new CancellationTokenSource())
    {
        // 设置 5 秒的超时时间。
        using (Timer timer = new Timer(state => cancellationTokenSource.Cancel(), null, 5000, Timeout.Infinite))
        {
            try
            {
                // 使用 CancellationToken 启动任务。
                var task = MessageLoopWorker.Run(DoWorkAsync, cancellationTokenSource.Token, trackingUrl);

                // 等待任务完成。
                task.Wait(cancellationTokenSource.Token);

                // 如果任务成功完成,获取结果。
                if (!string.IsNullOrEmpty(task.Result?.ToString()))
                {
                    return new Uri(task.Result.ToString());
                }
            }
            catch (OperationCanceledException)
            {
                // 任务被取消。
            }
            catch (AggregateException ex)
            {
                // 处理任务中的其他异常
                foreach (var innerException in ex.InnerExceptions)
                {
                    // Log or handle inner exception appropriately
                    Console.WriteLine($"Inner Exception: {innerException.Message}");
                }
            }
        }
    }

    // 如果任务被取消或失败,则返回 null。
    return null;
}</code>

在此程式碼中,我們建立一個 CancellationTokenSource 並將其 CancellationToken 傳遞給 MessageLoopWorker.Run 方法。我們還設定一個計時器,在 5 秒後取消令牌。如果任務在超時前成功完成,我們將獲得結果。如果任務被取消,我們將捕獲 OperationCanceledException。最後,我們使用 using 語句釋放 CancellationTokenSourceTimer 資源,確保資源正確處理。 此外,新增了一個 AggregateException 的處理,以捕捉和處理 DoWorkAsync 任務中可能出現的其他異常。

This improved version uses using statements for proper resource management, preventing resource leaks. The addition of AggregateException handling makes the code more ust. Remember to handle the inner exceptions approated logging them或 taking other corrective actions.AggregateException

以上是如何在C#超時後取消任務。Wait()?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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