2009-12-16 16 views
1

Quel est le meilleur moyen d'intégrer du code non sécurisé pour les threads dans le framework .net?Création d'un pool de threads de travail pour un code non sécurisé pour les threads

J'ai une bibliothèque tierce qui n'est pas thread-safe en raison de son utilisation de variables statiques. La réécriture n'est pas une option. Cette bibliothèque est utilisée par un service Web asp.net qui reçoit beaucoup d'appels simultanés.

J'ai actuellement l'ai eu Enveloppé dans une classe proxy qui utilise des verrous pour assurer la sécurité de fil:

private static readonly object oneThreadAtATimePlease = new object(); 
public ISomething CalculateSomething(int someValue) 
{ 
    lock (oneThreadAtATimePlease) 
    { 
     return new UnsafeLibrary(someValue).DoSomething(); 
    } 
} 

Performance est faible puisque plusieurs appelants doivent attendre la serrure, mais les résultats sont corrects.

Je souhaite améliorer les performances en exécutant plusieurs instances de cette bibliothèque, chacune dans son propre AppDomain. Est-ce une approche raisonnable? Tout bon exemple de code à recommander?

+0

Il me semble que vous pourriez avoir un peu de temps supplémentaire à ré-instancier la bibliothèque à chaque fois - d'autant plus que vous l'instanciez dans le verrou. Il serait probablement préférable d'instancier une fois, puis de se référer à cette instance plus tard. –

+0

Bon point, Anon. Malheureusement, la bibliothèque doit être ré-instanciée pour chaque appel puisque le constructeur définit les variables statiques. J'ai révisé l'exemple de code ci-dessus pour refléter cela. –

Répondre

2

Vous pouvez également essayer de créer un message application en utilisant une file d'attente.

Ensuite, plusieurs threads pouvaient mettre en file d'attente des demandes et un seul thread pouvait fonctionner dans cette file d'attente et informer les autres threads des résultats. L'utilisation de la classe moniteur n'est pas toujours la méthode la plus rapide.

AppDomains sont une option. Cependant, vous devrez faire face à IPC.

0

Qu'en est-il d'un singleton contenant une seule instance de l'objet worker, plus une file d'attente de demandes?