2009-12-01 15 views
19

estoy creando un servicio web asmx y tengo que crear un subproceso para hacer un IO de fondo para actualizar los datos del sistema. ¿Cuál es la manera correcta? No estoy interesado en obtener ningún resultado para crear un hilo. Solo quiero que el hilo de trabajo ASP.NET cree un hilo que lo cargue y al final hace uno asignar (creo que asignar _alldata = newData es atómico donde ambas instancias de mi propia gran clase de clase SystemData) para que el hilo de trabajo que creó el nuevo hilo se puede propagar instantáneamentemanera correcta de crear subprocesos en la aplicación web ASP.NET

He leído un artículo http://msdn.microsoft.com/fi-fi/magazine/cc164128%28en-us%29.aspx#S2 que sugieren utilizar hilo no derivado de subprocesos. Sin embargo, el artículo trataba de un escenario diferente/más complejo y no me ayudó mucho.

Gracias: Matti

PS. He hecho esta pregunta también en what is the right way to spawn thread for database IO in asmx web service? pero eso fue muy complejo con muchas preguntas.

Respuesta

28

Algo como esto:

public delegate void Worker(); 
private static Thread worker; 

public static void Init(Worker work) 
{ 
    worker = new Thread(new ThreadStart(work)); 
    worker.Start(); 
} 

public static void Work() 
{ 
    // do stuff 
} 

Luego tome la iniciativa llamando Init(Work).

Si llama al BeginInvoke() o ThreadPool.QueueUserWorkItem(), utiliza un subproceso de grupo de subprocesos de ASP.NET, que puede afectar la escalabilidad de su aplicación.

En caso de que sea útil, cubro estos problemas en detalle en mi libro, junto con ejemplos de código, ejemplos de pruebas, etc.: Ultra-Fast ASP.NET.

+0

No iniciar un nuevo subproceso requiere más recursos que utilizar un subproceso del grupo de subprocesos? – SirMoreno

+0

gracias por la respuesta! ahora parece que hay un debate con usted y SirMoreno sobre si usar el hilo del grupo de subprocesos o no ... –

+1

Sí, comenzar un nuevo subproceso usa más recursos que un subproceso de subprocesamiento. Sin embargo, la idea no es comenzar un nuevo hilo para cada acción. En su lugar, inicie solo uno (o un número pequeño) de sus propios hilos, y luego transfiera WorkItems de algún tipo a ellos para su ejecución. Una vez más, el problema con los subprocesos de subprocesos es que reducirán la escalabilidad de su aplicación, ya que son los mismos subprocesos que se utilizan para procesar las páginas. – RickNZ

4

Tome un vistazo a:

http://www.codeproject.com/KB/cs/AsyncMethodInvocation.aspx?fid=326357&df=90&mpp=25&noise=3&sort=Position&view=Quick

Usted puede hacer algo como:

public delegate void MethodInvoker(); 

    private void Foo() 
    { 
     // sleep for 10 seconds. 
     Thread.Sleep(10000); 
    } 

protected void Button2_Click(object sender, EventArgs e) 
{ 
    // create a delegate of MethodInvoker poiting to 
    // our Foo function. 
    MethodInvoker simpleDelegate = new MethodInvoker(Foo); 

    // Calling Foo Async 
    simpleDelegate.BeginInvoke(null, null); 

} 
+0

BeginInvoke() utiliza una cadena de subprocesos de subproceso de ASP.NET. – RickNZ

+0

gracias por la respuesta! ahora parece que hay debate con usted y RickNZ sobre si usar el hilo del grupo de subprocesos o no ... –

+0

Si el subproceso no va a usar mucho tiempo de CPU (esperando un tercero como DB) es mejor que utilice un método personalizado grupo de subprocesos: http://stackoverflow.com/questions/1031763/net-custom-threadpool-with-separate-instances De lo contrario, creo que BeginInvoke es el camino correcto. – SirMoreno

Cuestiones relacionadas