2011-03-24 3 views
5

Objectif: Renversez 20 threads qui atteindront tous la méthode SessionFactory.GetSessionFactory(key) en même temps à des fins de test. (Je suis en train de simuler un environnement multi-thread tels que ASP.NET)Ce code est-il réellement multithread?

Question: En utilisant la méthode EndInvoke() je suis essentiellement appel à la méthode GetSessionFactory(key) synchrone ou est mon code correct à simuler plusieurs threads tous frapper GetSessionFactory(key) en même temps?

Merci,

Kyle

public void StressGetSessionFactory() 
{ 
    for (int i = 0; i < 20; i++) 
    { 
     Func<string, ISessionFactory> method = GetSessionFactory; 
     IAsyncResult asyncResult = method.BeginInvoke("RBDB", null, null); 
     ISessionFactory sessionFactory = method.EndInvoke(asyncResult); //My concern is with this call 

     Debug.WriteLine("RBDB ISessionFactory ID: " + sessionFactory.GetHashCode()); 
    } 

} 

static ISessionFactory GetSessionFactory(string key) 
{ 
    return SessionFactory.GetSessionFactory(key); 
} 
+0

Il suffit de cliquer sur la coche verte sous les meilleures réponses :) –

Répondre

8
IAsyncResult asyncResult = method.BeginInvoke("RBDB", null, null); 
ISessionFactory sessionFactory = method.EndInvoke(asyncResult); 

Il est pas parallèle, de MSDN:

La méthode EndInvoke est utilisée pour récupérer les résultats de l' appel asynchrone. Il peut être appelé à tout moment après BeginInvoke; Si l'appel asynchrone n'est pas terminé, EndInvoke se bloque jusqu'à ce que soit terminé.

Pour faire des appels parallèles, vous pouvez utiliser une abstraction de niveau supérieur (comme le TPL-à-dire vous donnerait tout cela presque gratuitement) ou légèrement factoriser votre code - faire les appels asynchrones d'abord, puis recueillir les résultats par la suite (non testé):

IAsyncResult[] asyncResult = new IAsyncResult[20]; 
ISessionFactory[] sessionFactories = new ISessionFactory[20]; 
Func<string, ISessionFactory> method = GetSessionFactory; 
for (int i = 0; i < 20; i++) 
{ 
    asyncResult[i] = method.BeginInvoke("RBDB", null, null); 
} 
for(int i = 0; i < 20; i++) 
{ 
    sessionFactories[i] = method.EndInvoke(asyncResult[i]); 
} 

Notez que avec BeginInvoke() vous ne disposez pas d'une garantie que vous êtes en fait faire 20 appels en parallèle, car il utilise le pool de threads il paralléliser comme il l'entend.

+1

Une meilleure façon serait de passer une méthode de rappel dans BeginInvoke et de l'appeler Debug.Writeline. Assurez-vous que vous appelez EndInvoke à l'intérieur de la fonction de rappel. – womp

Questions connexes