Gestion de l'annulation efficace des tâches en C #
La méthode CancellationToken.CancelNotification
seule n'arrête pas une tâche d'exécution; Il signale simplement l'annulation. Pour vous assurer qu'une tâche se termine proprement lors de l'annulation, vous devez intégrer activement la manipulation d'annulation dans la logique de la tâche.
Tiration du motif asynchrone basé sur les tâches (TAP)
L'approche la plus efficace consiste à utiliser TAP et le CancellationToken
cohérente:
CancellationToken
: Incorporer un paramètre CancellationToken
dans chaque méthode capable d'être annulée. cancellationToken.ThrowIfCancellationRequested()
. Si l'annulation est détectée, lancez une exception pour arrêter l'exécution. Exemple de code révisé avec Tap
Cet exemple amélioré montre une bonne manipulation d'annulation:
<code class="language-csharp">private async Task TryTask() { using (var source = new CancellationTokenSource()) { source.CancelAfter(TimeSpan.FromSeconds(1)); try { Task<int> task = Task.Run(() => slowFunc(1, 2, source.Token), source.Token); int result = await task; // Await will re-throw any exceptions. Console.WriteLine($"Task completed successfully: {result}"); } catch (OperationCanceledException) { Console.WriteLine("Task cancelled successfully."); } } } private int slowFunc(int a, int b, CancellationToken cancellationToken) { for (int i = 0; i < 1000000; i++) { cancellationToken.ThrowIfCancellationRequested(); // Check for cancellation // ... your long-running operation ... } return a + b; }</code>
Explication:
using
Déclaration: s'assure que le CancellationTokenSource
est correctement éliminé, même si des exceptions se produisent. try-catch
Bloc: gère le OperationCanceledException
lancé par cancellationToken.ThrowIfCancellationRequested()
, offrant une manipulation de l'annulation propre. slowFunc
: L'appel cancellationToken.ThrowIfCancellationRequested()
est stratégiquement placé dans la boucle, permettant des vérifications d'annulation fréquentes. Cela empêche le travail inutile après l'annulation demandée. Cette approche révisée garantit que la tâche s'arrêtera rapidement lorsque l'annulation sera demandée, empêchant les fuites de ressources et améliore la réactivité globale de l'application.
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!