Implémentation de délais d'attente pour les opérations asynchrones en C #
Gérer efficacement les opérations asynchrones nécessite souvent d'incorporer des mécanismes de délai d'expiration pour empêcher le blocage indéfini. Cet article montre comment annuler une opération Task.await
en C # après une période de délai d'expiration spécifiée en utilisant CancellationTokenSource
.
La classe CancellationTokenSource
fournit un mécanisme pour contrôler l'annulation des tâches asynchrones. En créant un CancellationTokenSource
et en passant son jeton à la tâche, vous pouvez déclencher l'annulation en cas de besoin.
Exemple de code:
L'enseignement de code C # suivant illustre l'utilisation de CancellationTokenSource
pour gérer les délais d'attente:
<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>
Cet extrait de code amélioré gère explicitement les valeurs nulles potentielles et garantit qu'une chaîne est renvoyée de GetFinalUrl
. L'utilisation de Task.WhenAny
élégamment attend la tâche DoWorkAsync
à terminer ou le délai d'expiration. Si un délai d'expiration se produit, cts.Cancel()
est appelé pour annuler proprement l'opération asynchrone et un TimeoutException
est lancé. La gestion des erreurs est améliorée pour fournir des messages d'exception plus spécifiques. N'oubliez pas d'adapter MessageLoopWorker.Run
pour gérer correctement le CancellationToken
.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!