首页 > 后端开发 > C++ > 如何在超时后取消 Task.Wait()?

如何在超时后取消 Task.Wait()?

Patricia Arquette
发布: 2025-01-27 22:21:09
原创
232 人浏览过

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

优雅地处理异步任务超时:在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中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板