Meilleure Façon d'envoyer un message à fil
Ce qui est le plus efficace et le plus rapide pour envoyer un message à un thread (pas de processus) qui s'exécutent dans le while(1) de la boucle en c#/.net:
- À l'aide d'un synchronisé de la file d'attente (par exemple dans Files d'attente de Blocage & Thread de Communication en C#)
- Exécute une boucle de message à l'Aide de l'Application.Exécuter des systèmes de winforms dans le contexte de thread et avant l'exécution de l'application.exécutez s'abonner à un événement qui capture le message vocal dans le contexte du thread.
- L'aide d'une douille ou un canal nommé pour envoyer le fil un message.
Dans Linux que j'ai l'habitude de le faire avec les sockets de domaine unix, ce qui est l'équivalent de la façon de le faire dans windows? partage de fichier de la mémoire? canal nommé?
Qu'en pensez-vous?
OriginalL'auteur Eyalk | 2009-12-20
Vous devez vous connecter pour publier un commentaire.
J'utiliserais un producteur/consommateur file d'attente, personnellement. C'est effectivement ce que les WinForms boucle de message, c'est juste dans un Windows Forms de manière spécifique.
Noter que si vous êtes en mesure d'utiliser .NET 4.0, il y a collections construit dans le cadre qui rendent cela très facile. En particulier, à l'aide d'un
BlockingCollection<T>
enroulé autour d'unConcurrentQueue<T>
faire ce que vous souhaitez.Je ne serais personnellement pas utiliser le GeeksCafe de code que j'avais encapsuler le producteur/consommateur, la nature dans sa propre classe qui enveloppements une file d'attente, plutôt que de traiter tout file d'attente de cette façon, via des méthodes d'extension. En particulier, vous avez besoin de toutes les parties de gérer la file d'attente correctement, ce qui signifie qu'il est préférable de lui donner sa propre API de mon point de vue.
Merci Jon, le producteur/consommateur de la file d'attente sera plus rapide que de canal nommé pour transférer le message?
Je soupçonne donc - mais de référence si vous êtes particulièrement concerné. Il a l'avantage de permettre les références de l'objet à être transféré directement, plutôt que d'un tube nommé qui serait fondamentalement vous forcer à sérialiser/désérialiser.
Qui est toujours un avantage si? Je pense qu'il y a une certaine sécurité inhérents à être forcé de ne pas le faire.
Cela dépend de ce que vous faites. Si vous avez déjà un immuable format de message, alors il est nettement plus efficace de simplement passer une référence autour de sérialiser et désérialiser. Il permet également d'utiliser des structures de données qui pas facilement être sérialisé. Mais oui, elle a aussi réduit l'isolement.
OriginalL'auteur Jon Skeet