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
핸들러가 추가되었습니다.
이 향상된 버전은 적절한 리소스 관리를 위해 using
문을 사용하여 리소스 누출을 방지합니다. AggregateException
처리를 추가하면 AggregateException
catch 블록 내에서 내부 예외를 적절하게 처리하는 것을 기억하세요. 기록하거나 기타 시정 조치를 취하세요.
위 내용은 C#에서 시간 초과 후 Task.Wait()를 취소하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!