2011-03-14 10 views
7

cómo llamar a más de un método al mismo tiempo en mi carga de página en asp.net ?? Tengo 4 métodos para llamar en mi evento de carga de página. pero quiero llamar a los 4 métodos y no esperar a que el 1er método obtenga el final y luego llamar al segundo método.¿Invoca o llama a más de un método al mismo tiempo?

¿Cómo lograr esto es en asp.net 4.0?

+0

uso multi-threading –

+0

Hola Abhishek, no puedes llamar a los 4 métodos a la vez, debe haber al menos un segundo retraso. Si aún desea llamar a los 4 métodos, entonces, como Davide Piras le dijo que utilice el multihilo y tome la ayuda de la clase "BackgroundWorker" porque el valor de retorno debe esperar hasta que se ejecuten los 4 métodos. – SharpUrBrain

+1

@SharpUrBrain - ¿qué tiene que ver "un segundo" con algo?Y IMO BackgroundWorker es una mala elección en el nivel web –

Respuesta

9
Task[] tasks = new Task[] 
{ 
    new Task(Method0), 
    new Task(Method1), 
    new Task(Method2), 
    new Task(Method3) 
} 

foreach(var task in tasks) 
    task.Start(); 

O más breve

new Task(Method0).Start(); 
new Task(Method1).Start(); 
new Task(Method2).Start(); 
new Task(Method3).Start(); 
+2

también, 'new [] {new Task (Method0), ..., new Task (MethodN)}' debería funcionar –

+0

Gracias @Marc, Edited! –

1

Si usted hace sus métodos asíncrono que funcionaría.

(talón básico):

method1(onReadyCallback1); 
method2(onReadyCallback2); 

private void onReadyCallback1() { 

} 

etc.

1

Tome un vistazo a la ThreadPool.QueueUserWorkItem y luego here para un ejemplo

de la documentación de MSDN

using System; 
using System.Threading; 
public class Example { 
    public static void Main() { 
     // Queue the task. 
     ThreadPool.QueueUserWorkItem(new WaitCallback(ThreadProc)); 

     Console.WriteLine("Main thread does some work, then sleeps."); 
     // If you comment out the Sleep, the main thread exits before 
     // the thread pool task runs. The thread pool uses background 
     // threads, which do not keep the application running. (This 
     // is a simple example of a race condition.) 
     Thread.Sleep(1000); 

     Console.WriteLine("Main thread exits."); 
    } 

    // This thread procedure performs the task. 
    static void ThreadProc(Object stateInfo) { 
     // No state object was passed to QueueUserWorkItem, so 
     // stateInfo is null. 
     Console.WriteLine("Hello from the thread pool."); 
    } 
} 
14

Primera apagado, es importante saber si lo que estás haciendo es sens ible. Si están todos vinculados a la CPU, entonces no haga esto, IMO; un servidor web ya está altamente enhebrado, y suele ser un lugar ocupado para comenzar. Hay muchas posibilidades de que reduzcas la velocidad al usar múltiples núcleos. Sin embargo, ¡se verá genial para 1 usuario!

Si está vinculado a IO, entonces hay cualquier número de formas de hacerlo; lo preferible sería utilizar los métodos asíncronos incorporados de lo que sea que esté hablando, para que pueda usar IOCP en lugar de los hilos normales. Entonces para un NetworkStream, usaría BeginRead(...) etc.

Luego necesita unir todo junto. Mucho más maneras; Personalmente tiendo a usar Monitor.Wait y Monitor.Pulse, ya que esto evita ir al código no administrado (muchos manejadores de espera son en realidad proporcionados por el sistema operativo).

También tenga en cuenta: el enhebrado/paralelismo viene en un paquete junto con muchas maneras divertidas de fallar; Normalmente solo debe preocuparse demasiado por métodos 0 datos estáticos para sincronización, pero si tiene múltiples hilos en una sola solicitud haciendo cosas: tenga cuidado con los baches ... hay muchos.

La próxima versión de .NET tiene la intención de hacer que las continuaciones sean mucho más fáciles; Necesito echar un vistazo para ver cuán fácilmente podemos aplicar el código experimental actual a los escenarios de IOCP.

+3

Nice Marc, esta es definitivamente la manera de responder a una pregunta como esta, ya que da un poco más de guía en lugar de solo responder la pregunta. –

+0

"Un servidor web ya está altamente enhebrado": esta línea me evitó múltiples llamadas para mi aplicación. ¡¡Gracias!! – xameeramir

Cuestiones relacionadas