Maison >développement back-end >C++ >Comment puis-je annuler de manière fiable une tâche attendue dans Winrt?

Comment puis-je annuler de manière fiable une tâche attendue dans Winrt?

Linda Hamilton
Linda Hamiltonoriginal
2025-01-26 12:51:09768parcourir

How Can I Reliably Cancel an Awaitable Task in WinRT?

Traiter l'annulation peu fiable de la tâche dans winrt

L'utilisation de CancelNotification pour arrêter les tâches WinRT peut être peu fiable; La méthode peut sembler réussir, mais la tâche continue en cours d'exécution. Cela conduit souvent à un statut de tâche terminé malgré la tentative d'annulation.

Une approche d'annulation robuste

La solution réside dans la compréhension de l'annulation .NET et le modèle asynchrone basé sur les tâches (TAP). TAP recommande d'utiliser CancellationToken dans les méthodes asynchrones. L'étape cruciale consiste à passer le CancellationToken à chaque méthode annulée et à incorporer des vérifications régulières dans ces méthodes.

Exemple de code amélioré:

Ce code révisé démontre une annulation de tâche fiable à l'aide de await:

<code class="language-csharp">private async Task TryTask()
{
  var source = new CancellationTokenSource();
  source.CancelAfter(TimeSpan.FromSeconds(1));
  var task = Task.Run(() => slowFunc(1, 2, source.Token), source.Token);

  try
  {
    // Await the task; an exception is thrown if cancelled.
    await task;
  }
  catch (OperationCanceledException)
  {
    // Handle cancellation gracefully.
    Console.WriteLine("Task cancelled successfully.");
  }
}

private int slowFunc(int a, int b, CancellationToken cancellationToken)
{
  string someString = string.Empty;
  for (int i = 0; i < 1000000; i++)
  {
    someString += i.ToString(); // Simulate long-running operation
    cancellationToken.ThrowIfCancellationRequested();
  }
  return a + b;
}</code>

Ce code utilise CancellationToken comme suit:

  • Gestion des exceptions: await task lance un OperationCanceledException si la tâche est annulée. Cette exception est capturée et manipulée.
  • Vérification d'annulation régulière: cancellationToken.ThrowIfCancellationRequested() Inside slowFunc Vérifie régulièrement les demandes d'annulation.
  • Annulation gracieuse: Si l'annulation est détectée, ThrowIfCancellationRequested lance une exception, propageant le signal d'annulation dans la pile d'appel.

Cette approche garantit une annulation fiable des tâches await ed dans WinRT, empêchant les processus de fond et fournissant une solution plus robuste.

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn