Terminez gracieusement les threads dans .NET
Lorsque vous terminez des threads dans .NET, veillez à éviter d'utiliser la fameuse méthode Thread.Abort() car elle peut conduire à une instabilité. En revanche, les stratégies proactives, telles que les vérifications booléennes volatiles ou le mécanisme Task Parallel Library (TPL), offrent des alternatives plus sûres.
Annulation de la collaboration à l'aide de Volatile Bool
Semblable à la politique utilisateur mentionnée dans la réponse Stack Overflow, une approche consiste à implémenter un bool volatile, _shouldStop
. Vérifiez périodiquement cet indicateur dans le code de votre thread, lui permettant de se terminer correctement lorsque l'indicateur est signalé. Bien que cette approche fonctionne bien pour les processus cycliques, elle peut sembler trop lourde pour des opérations commerciales plus complexes.
Mécanisme d'annulation TPL
TPL introduit une solution plus sophistiquée en fournissant CancellationToken
et CancellationTokenSource
. En obtenant le CancellationToken
et en validant périodiquement son attribut IsCancellationRequested
, votre fil de discussion peut répondre aux demandes d'annulation. CancellationTokenSource
fournit une méthode Cancel
pour déclencher ce comportement.
Poignée d'attente pour les opérations planifiées
Pour les threads qui doivent attendre des intervalles ou des signaux, les poignées d'attente (telles que ManualResetEvent
) ou les primitives de synchronisation des threads (telles que Monitor.Wait()
) fournissent une solution efficace. Définir ManualResetEvent
ou émettre Monitor.Pulse()
peut signaler l'arrêt de votre fil de discussion, permettant une terminaison en douceur même en cas de blocage d'appels.
Scénarios spéciaux et interruptions de fil
Les scénarios spéciaux peuvent avoir des mécanismes de terminaison de thread uniques. Par exemple, Socket.Close()
peut interrompre une opération Send()
ou Receive()
, débloquant ainsi votre fil de discussion. Bien que Thread.Interrupt
puisse sembler attrayant en raison de sa simplicité, il doit être utilisé avec prudence car il ne peut interrompre que des appels bloquants BCL spécifiques, et l'identification des points d'interruption sûrs est souvent difficile.
En fin de compte, le choix de la stratégie de terminaison des threads dépend du scénario spécifique. En implémentant l'une de ces méthodes au lieu de Thread.Abort()
, vous pouvez terminer le thread de manière fiable tout en préservant l'intégrité de votre code et en maximisant la stabilité 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!