2010-02-01 4 views
2

Lors d'un appel begin ... async, le délégué que je passe est traité (selon la documentation) dans le pool de threads par défaut.Comment puis-je traiter les rappels asynchrones dans un pool de threads différent?

par exemple: System.IO.Stream.BeginRead ( octet tampon [], int offset, int count, rappel AsyncCallback, état de l'objet);

Comment puis-je faire en sorte que je puisse utiliser un pool de threads dédié pour la gestion de méthode asynchrone?

(Je sais que cela peut être fait depuis le CCR (Concurrency Coordination Runtime) fait également ceci (en fonction de leur documentation))

Répondre

2

à proprement parler, il est traité dans la partie IO du pool de threads (IO asynchrone les opérations ont leur propre ensemble de threads distincts de ceux utilisés par les méthodes ThreadPool.Queue*).

La seule façon de le faire actuellement (avec libérés/outils pris en charge) serait d'avoir une méthode stub passé à BeginRead qui transmet l'exécution à votre propre pool de threads:

var async = stream.BeginRead(buffer, offset, count, 
          ayn => { MyThreadPool.Dispatch(() => { 
           // Handle completion 
          }}, null); 

Le cadre Reactive Extensions (RX) rendrait cela plus facile: créer une implémentation IScheduler pour votre pool de threads, mais RX est un CTP et il est probable qu'il prenne un peu de temps avant d'être mis en service.

+0

si je vous comprends bien: le pool de threads .Net est utilisé pendant une fraction de seconde pour passer l'appel? – Toad

+0

Oui. Je ne pense pas qu'il est possible d'éviter cela parce que l'IO asynchrone utilise le port .NET FX IO Completion qui est serveur par le pool d'E/S. – Richard

Questions connexes