2010-03-05 5 views
8

En utilisant un délégué, je peux appeler n'importe quelle fonction de manière asynchrone. D'après la documentation, je comprends que cela se fait en mettant en file d'attente un poste de travail pour le pool de threads.Différence entre les appels asynchrones et les appels io asynchrones en .net

On peut aussi faire des appels asynchrones aux fonctions IO (comme lire des sockets, des fichiers, des pages Web, etc.). Je pense (mais je ne suis pas sûr) que cela ne génère pas un workitem dans le pool de threads. Ce n'est que lorsque le résultat est obtenu (ou une erreur) que le rappel est appelé depuis un nouveau thread dans le pool de threads.

Cette hypothèse est-elle correcte? Ou est un appel d'E/S asynchrone, également sous les couvertures juste un fil qui est engendré? Si tel est le cas, comment les appels asynchrones peuvent-ils être plus performants que les threads générateurs (en utilisant un pool de threads) et bloquer?

également: combien d'appels asynchrones peut-on traiter à un moment donné? Dans le cas d'un pool de threads utilisé, je suppose que vous le souhaitez. Mais en cas d'appels asynchrones d'E/S, y a-t-il une limite? Et est-ce, comment savez-vous quelle est la limite?

Répondre

7

L'E/S asynchrone est une chose beaucoup plus compliquée que l'utilisation d'un autre thread du pool de threads.

Il existe de nombreuses techniques différentes à l'intérieur OS, qui prennent en charge asynchrone IO:

1 Signalement un objet noyau de l'appareil

Pas utile pour effectuer plusieurs requêtes d'E/S simultanée contre un seul appareil. Permet à un thread d'émettre une requête d'E/S et un autre thread de le traiter.

2 Signalisation un objet de noyau d'événement

permet de multiples demandes d'E/S simultanément contre un seul appareil. Permet à un thread d'émettre une requête d'E/S et un autre thread de le traiter.

3 Utilisation d'E/S alertable

permet de multiples demandes d'E/S simultanément contre un seul appareil. Le thread qui a émis une requête d'E/S doit également le traiter.

4 Utilisation des ports de terminaison d'entrées/sorties

Permet à de multiples demandes d'E/S simultanément contre un seul appareil. Permet à un thread d'émettre une requête d'E/S et un autre thread de le traiter. Cette technique est hautement évolutive et a le plus de flexibilité.

+0

@sergey: donc vous dites qu'il y a effectivement une différence. Ensuite, combien de demandes d'entrées-sorties peuvent être en attente à un moment donné? Quel est le sweetspot? Est-ce que cela dépend de l'IO ciblé ou autre chose? Comment peut-on savoir? – Toad

+0

Simle réponse: cela dépend. Si vous utilisez des ports d'achèvement d'E/S (c'est la technique la plus compliquée mais la plus puissante), le système d'exploitation créerait le moins de thread possible (dépend de votre configuration matérielle) pour gérer toutes les tâches d'E/S actives. Utiliser IO alertable nécessite un thread pour! Chaque! opérations d'E/S en attente. C'est pourquoi les ports de coplection IO sont beaucoup plus efficaces et évolutifs: vous pouvez gérer! demandes d'E/S simultanées avec des ressources minimales. Je pense que vous devriez lire "Windows via C/C++" ou "Programmation côté serveur" par Jeffrey Richter pour comprendre tout cela. C'est assez difficile! –

+0

@reinier Les limites sont basées sur tout, depuis votre nombre de processeurs jusqu'à votre clé de licence Windows. Mais les limites ne sont pas importantes - tant que vous utilisez les méthodes asynchrones qui vous sont fournies par la BCL, vous * savez * vous obtiendrez une meilleure évolutivité que si vous par exemple. 'QueueUserWorkItem'. – bzlm

Questions connexes