2009-08-26 7 views
4

Une instance de System.Net.Sockets.Socketémet .NET C# Socket Concurrency

peut être partagée par 2 fils donc on utilise la méthode d'envoi() et un autre, il est la méthode receive()?

Est-il sécuritaire? Eh bien, j'ai besoin que ce soit non seulement thread-safe, mais aussi que les méthodes send/receive soient non-synchronisées, de manière à ce que chaque thread les appelle simultanément.

Est-ce que j'ai une autre façon de le faire? Merci pour votre aide, je suis expérimenté dans Java, mais j'ai du mal à essayer de faire celui-ci.

Répondre

6

Il devrait être sûr, oui. La classe Socket est citée par MSDN to be fully thread-safe.

Je ne sais pas si c'est une bonne idée cependant. Vous pourriez être difficile pour vous en utilisant deux threads. Vous voulez probablement regarder BeginSend et BeginReceive pour les versions asynchrones, auquel cas vous ne devriez pas avoir besoin de plusieurs threads.

+1

D'abord, je suis préoccupé non seulement par la sécurité des threads, mais aussi par l'utilisation simultanée de la lecture/écriture. et Hmm, ok, laissez-moi demander quelque chose de plus s'il vous plaît répondez-moi. Sous le capot, l'utilisation de ces méthodes asynchrones gère un autre thread pour atteindre le droit d'asincronicité? Si oui, chaque fois que j'appelle commencer ..., cela va-t-il créer un nouveau fil? –

+1

Pour autant que je sache, un nouveau thread est créé, mais il ne sera pas un nouveau thread pour chaque appel. J'ai fait un petit test pour confirmer, et ça a l'air de ça. – Thorarin

+0

Toute référence s'il vous plaît: D –

2

Oui, il est parfaitement sûr d'accéder à envoyer et recevoir à partir de deux threads différents en même temps.

Si vous souhaitez que votre application s'adapte à 100 sockets actifs, vous devez utiliser les méthodes BeginReceiveve/BeginSend au lieu de créer des threads manuellement. Cela fera de la magie dans les coulisses afin que vous n'engendriez pas des centaines de threads pour traiter les sockets. Qu'est-ce que c'est exactement dépend de la plateforme. Sur Windows, vous utiliserez les ports de complétion io 'haute performance'. Sous linux (mono) vous utiliserez epoll je crois. De toute façon, vous finirez par utiliser beaucoup moins de threads que les sockets actifs, ce qui est toujours une bonne chose :)

+0

Pourquoi dites-vous que l'utilisation d'un thread dédié à la réception/l'envoi imposera une plus grande latence ou imposera un problème d'évolutivité plutôt que d'utiliser le méthodes asynchrones? –

+1

Supposons que vous ayez 500 sockets ouvertes et que vous en receviez seulement. Vous devez créer 500 threads, chacun bloquant sur Socket.Receive(). Maintenant, supposons que vous utilisiez la version asynchrone BeginReceive de la méthode. Le runtime .NET remettra les sockets au système d'exploitation et dira "Dites-moi quand ils ont des données".Lorsqu'ils ont des données, le moteur d'exécution récupère un thread du pool de threads et appelle l'AsyncCallback afin que vous puissiez traiter vos données. Ceci est un * lot * plus performant que le changement de contexte 500 threads. – Alan

2

Peu hors sujet, mais l'utilisation de méthodes de synchronisation n'est utile que si vous avez des clients limités. J'ai compris que les prises asynchrones sont plus lentes en réponse. Les sockets async sont beaucoup mieux avec la manipulation de nombreux clients.

Donc: la synchronisation est beaucoup plus rapide. async est plus évolutif