2011-03-24 22 views
5

Meta: Haga girar 20 hilos que afectarán el método SessionFactory.GetSessionFactory(key) al mismo tiempo para realizar pruebas. (Estoy tratando de simular un entorno multi-hilo, tales como ASP.NET)¿Este código es realmente multiproceso?

Pregunta: Al utilizar el método de EndInvoke() estoy esencialmente una llamada al método GetSessionFactory(key) sincrónica o es mi código correcto en la simulación de múltiples hilos de toda golpear GetSessionFactory(key) al mismo tiempo?

Gracias,

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

Simplemente haga clic en la marca de verificación verde debajo de dichas mejores respuestas :) –

Respuesta

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

No es paralela, desde MSDN:

Se utiliza el método EndInvoke a recuperar los resultados de la llamada asincrónica . Se puede llamar en cualquier momento después de BeginInvoke; si la llamada asincrónica no se ha completado, EndInvoke se bloqueará hasta que se complete .

Para realizar llamadas paralelas se puede utilizar un nivel de abstracción más alto (al igual que el TPL es decir, le daría todo esto casi gratis) o ligeramente refactorizar su código - hacer que las llamadas asíncronas primera, se recogen los resultados después (no probado):

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]); 
} 

tenga en cuenta que con BeginInvoke() usted no tiene una garantía de que usted es, de hecho, hacer 20 llamadas en paralelo, ya que utiliza la agrupación de hebras que se paralelizar como lo considere oportuno.

+1

Una mejor manera sería pasar un método de devolución de llamada en BeginInvoke, y hacer que llame a Debug.Writeline. Solo asegúrate de llamar a EndInvoke dentro de la función de devolución de llamada. – womp

Cuestiones relacionadas