ホームページ > バックエンド開発 > C++ > C#でタイムアウト後にtask.wait()をキャンセルする方法は?

C#でタイムアウト後にtask.wait()をキャンセルする方法は?

Mary-Kate Olsen
リリース: 2025-01-27 22:16:13
オリジナル
639 人が閲覧しました

How to Cancel a Task.Wait() After a Timeout in C#?

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 ステートメントを使用して usingCancellationTokenSource リソースを解放し、リソースが正しく処理されることを確認します。 さらに、Timer タスクで発生する可能性のある他の例外をキャッチして処理するための AggregateException ハンドラーが追加されました。 DoWorkAsync

この改良版では、適切なリソース管理のために

ステートメントを使用し、using 処理の追加により、コードが AggregateException catch ブロック内で適切に処理されるようにします。ログに記録するか、他の是正措置を講じます。AggregateException

以上がC#でタイムアウト後にtask.wait()をキャンセルする方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート