C# の Task.Wait() メソッドのタイムアウトキャンセル
このコードでは、MessageLoopWorker.Run
がメッセージ ポンプを使用して新しいスレッドで開始され、DoWorkAsync
タスクがこのスレッドで実行されます。次に、メインスレッドでタスクを待ち、タスクが完了するまでメインスレッドをブロックします。
タイムアウト後にタスクをキャンセルするには、CancellationToken
クラスを使用できます。 CancellationToken
クラスを使用すると、キャンセル要求をあるスレッドから別のスレッドに伝達できます。
タイムアウト後にタスクをキャンセルするようにコードを変更する方法は次のとおりです:
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; }
このコードでは、CancellationTokenSource
を作成し、それを CancellationToken
メソッドに渡します。 5 秒後にトークンをキャンセルするタイマーも設定しました。タイムアウトする前にタスクが正常に完了すると、結果が得られます。タスクがキャンセルされた場合は、MessageLoopWorker.Run
をキャプチャします。最後に、OperationCanceledException
ステートメントを使用して using
と CancellationTokenSource
リソースを解放し、リソースが正しく処理されることを確認します。 さらに、Timer
タスクで発生する可能性のある他の例外をキャッチして処理するための AggregateException
ハンドラーが追加されました。 DoWorkAsync
ステートメントを使用し、using
処理の追加により、コードが AggregateException
catch ブロック内で適切に処理されるようにします。ログに記録するか、他の是正措置を講じます。AggregateException
以上がC#でタイムアウト後にtask.wait()をキャンセルする方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。