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.
Je pense que j'ai quelque chose: il y a un Socket.Select dans .NET. –
Maintenant, ma question est, laquelle évolue mieux du côté serveur, select() ou BeginAccept()? –