비동기 작업 시간 초과를 적절하게 처리: 5초 이내에 Task.Wait() 취소
이 코드의 GetFinalUrl
메서드는 프로그래밍 방식으로 웹 브라우저를 인스턴스화하고, URL로 이동하고, 문서 로드가 완료된 후 최종 URL을 반환합니다. 문서가 5초 이상 로드될 때 작업을 중지하고 GetFinalUrl()
가 null을 반환하도록 하려면 timeout 작업 메서드를 사용할 수 있습니다. 수정된 코드는 다음과 같습니다.
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을 반환합니다. 잠재적인 NullReferenceException을 방지하기 위해 task.Result
에 추가된 null 검사에 유의하세요.
이러한 방식으로 우리는 긴 차단을 효과적으로 방지하고 잠재적인 시간 초과 상황을 적절하게 처리합니다.
위 내용은 타임 아웃 후 task.wait ()를 취소하는 방법?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!