超時取消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 ust. Remember to handle the inner exceptions approated logging them或 taking other corrective actions.AggregateException
以上是如何在C#超時後取消任務。Wait()?的詳細內容。更多資訊請關注PHP中文網其他相關文章!