2009-07-25 10 views
1

Je sais que .NET a un bon modèle asynchrone pour les E/S réseau, qui utilise le port d'achèvement sous le capot. Mais tous les rappels se produisent sur les threads IO du pool de threads..Équivalent du sélecteur NIO de Java

Y at-il des homologues .NET comme le sélecteur Java qui gère plusieurs flux dans un seul thread? Ou, les rappels du pool de threads sont-ils mieux adaptés que cette approche à un seul thread?

Merci,

Dodd

+0

Je pense que j'ai quelque chose: il y a un Socket.Select dans .NET. –

+0

Maintenant, ma question est, laquelle évolue mieux du côté serveur, select() ou BeginAccept()? –

Répondre

2

Pour les opérations async une poignée IO est associée à la piscine de fil. Une fois l'opération asynchrone terminée, je crois que les rappels (pour chaque flux) peuvent ou non s'exécuter en utilisant le même thread, tout thread de threads disponible peut traiter le callback, il est possible que le même thread traite plusieurs callbacks ou un seul rappel basé sur les conditions d'exécution.

Hope this helps

EDIT: Ajout réponse au commentaire de Dodd

Je ne suis pas très familier avec l'API de sélection mais de regarder un exemple affiché here il semble que Selector attend jusqu'à ce que tous les événements se produisent. Est-ce vrai? Si tel est le cas, l'appelant doit attendre que tous les événements se produisent même lorsqu'un événement survient plus tôt que l'autre. Mais si le sélecteur fonctionne en traitant un événement dès qu'il se produit, on pourrait se retrouver dans une situation où le sélecteur traite le rappel pour un événement alors qu'un autre arrive (j'imagine que dans ce cas l'événement entrant serait mis en file d'attente quelque part ou bien vous perdriez des événements) mais cela réduirait encore le débit lorsque les événements sont orthogonaux et devraient être traités dès qu'ils se produisent. Le modèle asynchrone dans .NET est centré autour du pool de threads pour réduire le temps de création d'un nouveau thread (car c'est une opération coûteuse). Si vous observez que le pool de threads est au maximum, vous pouvez augmenter le nombre de Thread dans le pool en tant que documented ici. Gardez à l'esprit que, à la fin de la journée, vous êtes limité au nombre de processeurs. Dans une boîte double cœur, seulement 2 threads peuvent être actifs, tous les autres sont bloqués, ce qui peut être quelque chose à prendre en compte.

Espérons que cela aide.

+0

Le ThreadPool et l'algorithme d'ordonnancement subissent une révision majeure dans .NET4 pour soutenir TPL et effectuer une programmation plus intelligente des threads (tâches) –

0

Merci Abhijeet,

Eh bien, je crains que, dans certains senarios très occupés, beaucoup se produisent simultanément callbacks async et nous manquons de fils: alors le changement de contexte sera cauchemar. Dans ce cas particulier, le rappel asynchrone est-il le bon choix? Ou devrions-nous utiliser Select()?

+0

Microsoft a eu huit ans maintenant pour découvrir si c'est un problème. –

+0

Hey Dodd, ce devrait vraiment être un commentaire sur la question @ Abhijeet, pas une nouvelle réponse (bienvenue à SO au fait.) –

+0

@Dodd: Je vais ajouter ma réponse (ci-dessous) –