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

如何在超時後取消任務()?

Patricia Arquette
Patricia Arquette原創
2025-01-27 22:21:09219瀏覽

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

優雅地處理異步任務超時:在5秒內取消Task.Wait()

這段代碼中的GetFinalUrl方法以編程方式實例化一個Web瀏覽器,導航到一個URL,並在文檔加載完成後返回最終URL。為了在文檔加載超過5秒時停止任務並使GetFinalUrl()返回null,可以使用超時任務方法。以下是修改後的代碼:

<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);
    // 创建一个超时取消令牌源
    using (var timeoutCts = new CancellationTokenSource(TimeSpan.FromSeconds(5)))
    {
        var task = MessageLoopWorker.Run(DoWorkAsync, trackingUrl, timeoutCts.Token);
        try
        {
            // 在超时时间内等待任务完成
            task.Wait(timeoutCts.Token);
            if (!String.IsNullOrEmpty(task.Result?.ToString()))
            {
                return new Uri(task.Result.ToString());
            }
        }
        catch (OperationCanceledException)
        {
            // 任务超时,返回null
            return null;
        }
    }
    throw new Exception("解析失败");
}</code>

在這個修改後的代碼中,使用CancellationTokenSource(TimeSpan)構造函數創建了一個超時為5秒的CancellationTokenSource (timeoutCts)。然後使用Wait(CancellationToken)方法等待任務在CancellationToken指定的超時時間內完成。如果任務在超時時間內未完成,則拋出OperationCanceledException異常,GetFinalUrl方法返回null。 注意對task.Result添加了空檢查,避免潛在的NullReferenceException。

通過這種方式,我們有效地避免了長時間阻塞,並優雅地處理了潛在的超時情況。

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

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