L'ensemble de l' SetSynchronizationContext
est un leurre, c'est juste un mécanisme de regroupement, le travail se produit toujours dans les IO de Pool de Threads.
Ce que vous demandez est un moyen de file d'attente et de la récolte, les Appels de Procédure Asynchrone pour tous vos IO travail depuis le thread principal. De nombreux niveau supérieur des cadres de l'envelopper de ce genre de fonctionnalité, le plus célèbre étant libevent.
Il y a un grand récapitulatif sur les différentes options ici: quelle est la différence entre epoll, sondage, threadpool?.
.NET se charge déjà de mise à l'échelle pour vous en avoir un spécial "IO Pool de Threads" qui gère IO accès lorsque vous appelez l' BeginXYZ
méthodes. Cette IO Pool de Threads doit avoir au moins 1 thread par le processeur sur la boîte. voir: pool de threads.SetMaxThreads.
Si seul thread app est une exigence critique de quelques fous de la raison), vous pouvez, bien sûr, d'interopérabilité de toutes ces choses à l'aide de DllImport (voir un exemple ici)
Cependant, il serait très complexe et risqué de la tâche:
Pourquoi n'avons-nous pas le soutien de l'Apc comme un mécanisme d'auto-complétion? Les apc sont vraiment pas un bon usage général mécanisme d'auto-complétion de code d'utilisateur. La gestion de la réentrée introduit par l'Apc est presque impossible; tout moment vous bloquer sur un verrou, par exemple, certains arbitraire fin d'e/S peut prendre le contrôle de votre fil. Il pourrait essayer d'acquérir les verrous de sa propre, ce qui peut introduire de verrouillage de la commande de problèmes et donc de blocage. La prévention ce qui nécessite une conception soignée, et la capacité de faire en sorte que quelqu'un d'autre code ne sera jamais exécuté, au cours de votre alertable attendre, et vice-versa. Cela limite grandement l'utilité de l'Apc.
Donc, pour récapituler. Si vous voulez un seul thread processus de gestion qui fait tout son travail à l'aide de l'APC et de l'achèvement des ports, vous allez avoir à la main code. D'un bâtiment, il serait risqué et difficile.
Si vous voulez tout simplement à grande échelle de réseaux, vous pouvez continuer à l'utiliser BeginXYZ
et de la famille et de repos assuré qu'il sera bien, car il utilise de l'APC. Vous payez un mineur prix ordonnancement des choses entre les threads et les .NET notamment la mise en œuvre.
De: http://msdn.microsoft.com/en-us/magazine/cc300760.aspx
La prochaine étape dans l'expansion le serveur est d'utiliser asynchronous I/o I/O Asynchrone atténue la nécessité de créer et de gérer des threads. Cela conduit à un code bien plus simple et aussi plus efficace pour I/O modèle. Asynchronous I/O utilise des fonctions pour gérer les données et les connexions, ce qui signifie qu'il n'existe pas de listes de configurer et d'analyse, et il n'est pas nécessaire de créer de nouveaux threads de travail pour faire face à l'attente de l'I/O.
Intéressant, côté de fait, c'est que seul thread n'est pas le moyen le plus rapide pour faire async sockets sous Windows à l'aide d'achèvement des ports, voir: http://doc.sch130.nsc.ru/www.sysinternals.com/ntw2k/info/comport.shtml
Le but du serveur est de subir quelques changements de contexte que possible en demandant à son fils éviter les blocages inutiles, alors que dans le même temps maximiser le parallélisme par l'utilisation de plusieurs threads. L'idéal est d'avoir un thread activement à l'entretien d'une demande du client sur chaque processeur et pour ces fils de ne pas bloquer si il y a d'autres demandes en attente lorsqu'ils ont terminé leur demande. Pour que cela fonctionne correctement, cependant, il doit y avoir un moyen de l'application pour activer un autre thread lorsqu'un traitement d'une demande du client, des blocs d'e/S (comme quand on lit un fichier dans le cadre de la transformation).