在 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中文網其他相關文章!