優雅地處理異步任務超時:在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中文網其他相關文章!