2010-12-05 31 views
2

Je voudrais utiliser le modèle io asynchrone C# pour mon socket. J'ai plusieurs threads qui doivent envoyer sur le socket. Quelle est la meilleure façon de gérer cela? Une piscine de N douilles, avec accès contrôlé par serrure? Ou est-ce que asynch envoie un thread sécurisé pour plusieurs threads accédant à une socket unique?C# socket asynchrone accédé par plusieurs threads

THanks!

Jacko

+0

http://www.albahari.com/threading/ est pratique à lire lorsque vous essayez de trouver la meilleure solution de filetage. – Patrick

+0

Avez-vous un protocole à suivre? Les flux doivent-ils être transférés séquentiellement? – Patrick

+0

Merci, Patrick. Albahari a l'air utile. J'utilise le socket pour définir et obtenir des valeurs sur un serveur distant. Je regarde dans le socket asynchrone io, mais je comprends qu'il utilise le pool de threads du système. Donc, je – Jacko

Répondre

2

Les méthodes async créent déjà de nouveaux threads pour envoyer les données. Cela va probablement ajouter des frais inutiles à votre application. Si vous avez déjà plusieurs threads, vous pouvez créer un type d'objet IDispoable pour représenter l'accès au socket et un gestionnaire qui contrôlera le checkin et le checkout pour le socket. Le socket se vérifie lui-même lorsque la méthode d'élimination IDisposable est appelée. De cette façon, vous pouvez contrôler les méthodes que vos threads peuvent également utiliser sur le socket. Si le socket est déjà extrait par un autre thread, le gestionnaire bloque simplement jusqu'à ce qu'il soit disponible.

using (SharedSocket socket = SocketManager.GetSocket()) 
{ 
    //do things with socket 
} 
+0

Merci, bonne idée. J'ai déjà quelque chose comme ça. Je suis juste inquiet que cela n'évoluera pas bien au fur et à mesure que les fils d'appel grandiront. Ils pourraient passer beaucoup de temps à bloquer. – Jacko

+1

Si les threads n'écrivent que sur le socket, vous pouvez utiliser une file d'attente pour placer les données dans le socket et avoir un autre thread consommant les données. De cette façon, les threads d'appel n'auraient pas besoin de bloquer du tout. –

+0

Merci. Je vais essayer ça. Je veux aussi utiliser multi-core, donc je pourrais exécuter quelques-unes de ces sockets en file d'attente. – Jacko

1

System.Threading.Semaphore est quelque chose qui devient à portée de main dans la synchronisation et les conditions de course