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 サイトの他の関連記事を参照してください。