ObjectPool & lt; T & gt; ou similaire pour .NET déjà dans une bibliothèque?
Je ne veux pas écrire mon propre parce que j'ai peur, je risque de manquer de quelque chose et/ou rip off le travail d'autres personnes, donc, il y a un ObjectPool (ou similaire) de classe existant dans une bibliothèque .NET?
Par l'objet de la piscine, je veux dire une classe qui en facilite la mise en cache des objets qui prennent beaucoup de temps à créer, en général, utilisés pour améliorer les performances.
source d'informationauteur RCIX
Vous devez vous connecter pour publier un commentaire.
Mise à JOUR:
J'avais aussi mis de l'avant
type bufferblock<T>
de TPL DataFlow. Autant que je me souvienne c'est une partie de .net maintenant. La grande chose au sujetBufferBlock<T>
est que vous pouvez attendre de manière asynchrone pour les articles deviennent disponibles à l'aide de laPost<T>
etReceiveAsync<T>
les méthodes d'extension. Très pratique dans un async/await monde.RÉPONSE ORIGINALE À CETTE QUESTION
Un temps, j'ai été confronté à ce problème et est venu avec un léger (rough n'ready) thread-safe (je l'espère) de la piscine qui s'est révélée très utile, réutilisable et robuste:
Afin d'éviter toute interface exigences de la mise en commun des objets, à la fois la création et la réinitialisation des objets est effectuée par l'utilisateur fourni délégués: c'est à dire
Dans le cas où la piscine est vide, le BeginPop/EndPop paire de fournir un APM (ish) des moyens de récupération de l'objet de manière asynchrone lorsqu'il est disponible (à l'aide de Jeff Richter excellent AsyncResult<TResult> mise en œuvre).
Je ne me souviens pas pourquoi il est constained à T : classe... il n'y a probablement aucun.
Dans la prochaine version de .NET (4.0), il y a un
ConcurrentBag<T>
classe qui peut facilement être utilisé dans unObjectPool<T>
mise en œuvre; en fait, la il y a un article sur MSDN qui vous montre comment faire précisément cela.Si vous n'avez pas accès à la dernière .NET framework, vous pouvez obtenir le
System.Collections.Concurrent
espace de noms (qui aConcurrentBag<T>
).NET 3.5 à partir Microsoft Réactif Extensions (Rx) de la bibliothèque (en System.Threading.dll).CodeProject dispose d'un échantillon ObjectPool mise en œuvre. Jetez un oeil ici. Sinon, il y a quelques implémentations iciiciet ici.
Comment sur le Système.Les Collections.Génériques.Dictionnaire?
Sonne comme vous avez besoin d'un modèle de Fabrique avec la mise en cache.
Vous pouvez essayer de l'utiliser .net réflecteur à regarder le pool de threads mise en œuvre.