Meilleure façon de faire les événements asynchrones en C#
Événements sont synchrones en C#. J'ai cette application où mon formulaire principal démarre un thread avec une boucle à l'écoute d'un flux. Quand quelque chose arrive sur le stream d'un événement est déclenché à partir de la boucle pour le formulaire principal.
Si le formulaire principal est lent ou affiche une messagebox ou quelque chose de la boucle sera suspendu. Quel est le meilleur moyen de contourner cela? À l'aide d'un rappel et d'appeler sur le formulaire principal?
OriginalL'auteur Niklas Winde | 2008-09-17
Vous devez vous connecter pour publier un commentaire.
Hmmm, j'ai utilisé différents scénarios, qui dépendaient de ce dont j'avais besoin à l'époque.
Je crois que le BeginInvoke serait probablement le plus facile à code, puisque vous y êtes presque. De toute façon, vous devriez être en utilisant Invoquer déjà, donc, en changeant simplement de BeginInvoke. À l'aide d'un rappel sur un thread séparé d'accomplir la même chose (tant que vous utilisez le pool de threads pour la file d'attente de la fonction de rappel) à l'aide de BeginInvoke.
N'oubliez pas d'utiliser EndInvoke aussi bien, sinon pas exception à la appelé les méthodes seront jetés.
OriginalL'auteur Sam
Puisque vous êtes à l'aide d'un formulaire, le moyen le plus facile est d'utiliser le BackgroundWorker composant.
OriginalL'auteur jfs
Événements sont juste les délégués, afin de l'utiliser BeginInvoke. (voir Asynchrone à des Appels de Méthode dans l' .NET de l'Environnement)
OriginalL'auteur Davy Landman
Vous avez quelques options, comme nous l'avons déjà indiqué, mais dans mon expérience, vous feriez mieux de laisser les délégués et BeginInvoke, et à l'aide de BackgroundWorker à la place (v2.0+), comme il est plus facile à utiliser et vous permet également d'interagir avec le formulaire principal sur le fil de l'achèvement. Dans l'ensemble un très weel mise en œuvre de la solution, j'ai trouvé.
OriginalL'auteur Raithlin
Système.ComponentModel.BackgroundWorker est en effet un bon point de départ. Il fera de votre travail asynchrone, de vous donner les notifications d'événements importants, et a des façons de mieux intégrer avec vos formes.
Par exemple, vous pouvez activer des notifications de progression par l'enregistrement d'un gestionnaire pour l'événement ProgressChanged. (ce qui est hautement recommandé si vous avez un long processus asynchrone et que vous ne souhaitez pas que votre utilisateur pense que l'application gelé)
OriginalL'auteur el2iot2