ホームページ >バックエンド開発 >C++ >タイムアウト後に C# で Task.await 操作をキャンセルする方法

タイムアウト後に C# で Task.await 操作をキャンセルする方法

Linda Hamilton
Linda Hamiltonオリジナル
2025-01-27 22:13:10371ブラウズ

How to Cancel a Task.await Operation in C# After a Timeout?

C# での非同期操作のタイムアウトの実装

非同期操作を効果的に管理するには、多くの場合、無期限のブロックを防ぐためにタイムアウト メカニズムを組み込む必要があります。 この記事では、C# で Task.await.CancellationTokenSource を使用して、指定されたタイムアウト期間の経過後に

操作をキャンセルする方法を示します。

CancellationTokenSource クラスは、非同期タスクのキャンセルを制御するメカニズムを提供します。 CancellationTokenSource を作成し、そのトークンをタスクに渡すことで、必要に応じてキャンセルをトリガーできます。

コード例:

次の C# コード スニペットは、タイムアウトを処理するための CancellationTokenSource の使用法を示しています。

<code class="language-csharp">private static async Task<string> GetFinalUrl(PortalMerchant portalMerchant)
{
    // ... (Existing code for setting browser features and URL validation) ...

    Uri trackingUrl = new Uri(portalMerchant.Url);
    var cts = new CancellationTokenSource();
    var task = MessageLoopWorker.Run(DoWorkAsync, trackingUrl, cts.Token);

    // Use Task.WhenAny to monitor for task completion or timeout
    if (await Task.WhenAny(task, Task.Delay(5000, cts.Token)) == task)
    {
        // Task completed within the timeout
        if (!String.IsNullOrEmpty(task.Result?.ToString()))
        {
            return new Uri(task.Result.ToString()).ToString(); // Ensure string return
        }
        else
        {
            throw new Exception("Parsing Failed");
        }
    }
    else
    {
        // Timeout occurred
        cts.Cancel(); // Explicitly cancel the task
        throw new TimeoutException();
    }
}

static async Task<object> DoWorkAsync(object[] args)
{
    // ... (Existing code for web browser interaction) ...
}</code>

この改良されたコード スニペットは、潜在的な null 値を明示的に処理し、GetFinalUrl から文字列が返されるようにします。 Task.WhenAny を使用すると、DoWorkAsync タスクが完了するか、タイムアウトが期限切れになるまで待機します。 タイムアウトが発生した場合、非同期操作を完全にキャンセルするために cts.Cancel() が呼び出され、TimeoutException がスローされます。 エラー処理が改善され、より具体的な例外メッセージが提供されるようになりました。 MessageLoopWorker.Run を正しく処理できるように CancellationToken を適応させることを忘れないでください。

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

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。