Évitez d'utiliser Thread.Abort() pour annuler les tâches TPL
Lorsque vous utilisez des threads pour exécuter des tâches, si vous essayez de terminer le thread à l'aide de la méthode Abort()
, la tâche continuera à s'exécuter sans interruption. En effet, les tâches utilisent des threads d'arrière-plan du pool de threads et ces threads ne sont pas affectés par la terminaison des threads.
Alternative : jetons d'annulation
Afin de propager les demandes d'annulation aux tâches, un jeton d'annulation doit être utilisé. Ces marqueurs fournissent un mécanisme coopératif d'annulation de thread qui représente les demandes d'annulation comme des signaux que les tâches peuvent surveiller et auxquels ils peuvent répondre.
Implémentation à l'aide de balises d'annulation
L'extrait de code suivant montre comment utiliser une balise d'annulation pour implémenter l'annulation de tâches :
<code class="language-csharp">// 创建一个取消标记源 var ts = new CancellationTokenSource(); // 从源获取取消标记 CancellationToken ct = ts.Token; // 创建一个新任务 Task.Factory.StartNew(() => { while (true) { // 执行繁重的计算 Thread.Sleep(100); // 检查取消请求 if (ct.IsCancellationRequested) { Console.WriteLine("任务已取消"); break; } } }, ct); // 模拟等待任务完成3秒 Thread.Sleep(3000); // 决定取消任务 ts.Cancel();</code>
Remarques sur .Abort()
Il convient de noter qu'il n'est généralement pas recommandé d'utiliser la méthode Abort()
pour l'annulation de thread. Cette approche peut conduire à un comportement peu fiable et à des pannes potentielles d'applications. Les marqueurs d'annulation fournissent une méthode plus structurée et plus fiable pour l'annulation de tâches.
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!