首页 > 后端开发 > C++ > 如何在C#超时后取消任务。Wait()?

如何在C#超时后取消任务。Wait()?

Mary-Kate Olsen
发布: 2025-01-27 22:16:13
原创
587 人浏览过

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

超时取消C#中Task.Wait()的方法

这段代码中,MessageLoopWorker.Run 在一个带有消息泵的新线程上启动,并在该线程上执行 DoWorkAsync 任务。然后在主线程上等待该任务,阻塞主线程直到任务完成。

为了在超时后取消任务,可以使用 CancellationToken 类。CancellationToken 类允许您将取消请求从一个线程传播到另一个线程。

以下是修改代码以在超时后取消任务的方法:

<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);

    // 创建一个 CancellationTokenSource。
    using (CancellationTokenSource cancellationTokenSource = new CancellationTokenSource())
    {
        // 设置 5 秒的超时时间。
        using (Timer timer = new Timer(state => cancellationTokenSource.Cancel(), null, 5000, Timeout.Infinite))
        {
            try
            {
                // 使用 CancellationToken 启动任务。
                var task = MessageLoopWorker.Run(DoWorkAsync, cancellationTokenSource.Token, trackingUrl);

                // 等待任务完成。
                task.Wait(cancellationTokenSource.Token);

                // 如果任务成功完成,获取结果。
                if (!string.IsNullOrEmpty(task.Result?.ToString()))
                {
                    return new Uri(task.Result.ToString());
                }
            }
            catch (OperationCanceledException)
            {
                // 任务被取消。
            }
            catch (AggregateException ex)
            {
                // 处理任务中的其他异常
                foreach (var innerException in ex.InnerExceptions)
                {
                    // Log or handle inner exception appropriately
                    Console.WriteLine($"Inner Exception: {innerException.Message}");
                }
            }
        }
    }

    // 如果任务被取消或失败,则返回 null。
    return null;
}</code>
登录后复制

在此代码中,我们创建一个 CancellationTokenSource 并将其 CancellationToken 传递给 MessageLoopWorker.Run 方法。我们还设置一个计时器,在 5 秒后取消令牌。如果任务在超时前成功完成,我们将获取结果。如果任务被取消,我们将捕获 OperationCanceledException。最后,我们使用 using 语句释放 CancellationTokenSourceTimer 资源,确保资源得到正确处理。 此外,添加了一个 AggregateException 的处理,以捕获和处理 DoWorkAsync 任务中可能出现的其他异常。

This improved version uses using statements for proper resource management, preventing resource leaks. The addition of AggregateException handling makes the code more robust. Remember to handle the inner exceptions appropriately within the AggregateException catch block, such as logging them or taking other corrective actions.

以上是如何在C#超时后取消任务。Wait()?的详细内容。更多信息请关注PHP中文网其他相关文章!

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