Behandeln Sie Zeitüberschreitungen bei asynchronen Aufgaben ordnungsgemäß: Brechen Sie Task.Wait() innerhalb von 5 Sekunden ab
Die GetFinalUrl
-Methode in diesem Code instanziiert programmgesteuert einen Webbrowser, navigiert zu einer URL und gibt die endgültige URL zurück, nachdem das Dokument vollständig geladen wurde. Um die Aufgabe zu stoppen, wenn das Dokument länger als 5 Sekunden geladen wird, und dafür zu sorgen, dass GetFinalUrl()
null zurückgibt, können Sie die Timeout-Aufgabenmethode verwenden. Das Folgende ist der geänderte Code:
<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); // 创建一个超时取消令牌源 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("解析失败"); }</code>
In diesem modifizierten Code wird mithilfe des CancellationTokenSource(TimeSpan)
-Konstruktors ein CancellationTokenSource
(timeoutCts) mit einem Timeout von 5 Sekunden erstellt. Verwenden Sie dann die Methode Wait(CancellationToken)
, um darauf zu warten, dass die Aufgabe innerhalb des durch CancellationToken
angegebenen Zeitlimits abgeschlossen wird. Wenn die Aufgabe nicht innerhalb des Timeout-Zeitraums abgeschlossen wird, wird eine OperationCanceledException
-Ausnahme ausgelöst und die GetFinalUrl
-Methode gibt null zurück. Beachten Sie die hinzugefügte Nullprüfung für task.Result
, um eine mögliche NullReferenceException zu vermeiden.
Auf diese Weise vermeiden wir effektiv lange Blockierungen und gehen mit potenziellen Timeout-Situationen elegant um.
Das obige ist der detaillierte Inhalt vonWie storniere ich eine Aufgabe. Wait () nach einer Auszeit?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!