超时取消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
语句释放 CancellationTokenSource
和 Timer
资源,确保资源得到正确处理。 此外,添加了一个 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中文网其他相关文章!