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:
await task
lance un OperationCanceledException
si la tâche est annulée. Cette exception est capturée et manipulée. cancellationToken.ThrowIfCancellationRequested()
Inside slowFunc
Vérifie régulièrement les demandes d'annulation. 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!