优雅地处理异步任务超时:在5秒内取消Task.Wait()
这段代码中的GetFinalUrl
方法以编程方式实例化一个Web浏览器,导航到一个URL,并在文档加载完成后返回最终URL。为了在文档加载超过5秒时停止任务并使GetFinalUrl()
返回null,可以使用超时任务方法。以下是修改后的代码:
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("解析失败"); }
在这个修改后的代码中,使用CancellationTokenSource(TimeSpan)
构造函数创建了一个超时为5秒的CancellationTokenSource
(timeoutCts)。然后使用Wait(CancellationToken)
方法等待任务在CancellationToken
指定的超时时间内完成。如果任务在超时时间内未完成,则抛出OperationCanceledException
异常,GetFinalUrl
方法返回null。 注意对task.Result
添加了空检查,避免潜在的NullReferenceException。
通过这种方式,我们有效地避免了长时间阻塞,并优雅地处理了潜在的超时情况。
以上是如何在超时后取消 Task.Wait()?的详细内容。更多信息请关注PHP中文网其他相关文章!