首頁 > 後端開發 > C++ > 如何取消任務。超時後C#中的AWAIT操作?

如何取消任務。超時後C#中的AWAIT操作?

Linda Hamilton
發布: 2025-01-27 22:13:10
原創
420 人瀏覽過

How to Cancel a Task.await Operation in C# After a Timeout?

在 C# 中實現非同步操作的逾時

有效管理非同步操作通常需要結合超時機制來防止無限期阻塞。 本文示範如何在 C# 中使用 Task.await.CancellationTokenSource 在指定的超時時間後取消

操作

CancellationTokenSource類別提供了一種控制非同步任務取消的機制。 透過建立 CancellationTokenSource 並將其令牌傳遞給任務,您可以在需要時觸發取消。

範例程式碼:

以下 C# 程式碼片段說明如何使用 CancellationTokenSource 處理逾時:

private static async Task<string> GetFinalUrl(PortalMerchant portalMerchant)
{
    // ... (Existing code for setting browser features and URL validation) ...

    Uri trackingUrl = new Uri(portalMerchant.Url);
    var cts = new CancellationTokenSource();
    var task = MessageLoopWorker.Run(DoWorkAsync, trackingUrl, cts.Token);

    // Use Task.WhenAny to monitor for task completion or timeout
    if (await Task.WhenAny(task, Task.Delay(5000, cts.Token)) == task)
    {
        // Task completed within the timeout
        if (!String.IsNullOrEmpty(task.Result?.ToString()))
        {
            return new Uri(task.Result.ToString()).ToString(); // Ensure string return
        }
        else
        {
            throw new Exception("Parsing Failed");
        }
    }
    else
    {
        // Timeout occurred
        cts.Cancel(); // Explicitly cancel the task
        throw new TimeoutException();
    }
}

static async Task<object> DoWorkAsync(object[] args)
{
    // ... (Existing code for web browser interaction) ...
}
登入後複製

此改進的程式碼片段明確處理潛在的空值並確保從 GetFinalUrl 傳回字串。 使用 Task.WhenAny 優雅地等待 DoWorkAsync 任務完成或超時到期。 如果發生逾時,則會呼叫 cts.Cancel() 來徹底取消非同步操作,並拋出 TimeoutException 。 改進了錯誤處理以提供更具體的異常訊息。 請記得調整MessageLoopWorker.Run以正確處理CancellationToken

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

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