c# - forma correcta de crear subprocesos en la aplicación web ASP.NET
multithreading (2)
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
}
Entonces comienza las cosas llamando a Init(Work)
.
Si llama a BeginInvoke()
o ThreadPool.QueueUserWorkItem()
, utiliza un subproceso de agrupación de hebras ASP.NET, que puede afectar la escalabilidad de su aplicación.
En caso de que sea útil, cubro estos temas en detalle en mi libro, junto con ejemplos de código, puntos de referencia de ejemplo, etc.: Ultra-Fast ASP.NET .
Estoy creando un servicio web asmx y tengo que crear un hilo para hacer 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 hilos. Solo quiero que el subproceso de trabajo de ASP.NET cree un subproceso que se carga y al final hace una asignación (creo que asignar _alldata = newData es atómico donde ambas instancias de mi propia estructura grande clase SystemData) así que el subproceso de trabajo que creó El nuevo hilo puede propagarse instantáneamente.
Leí un artículo http://msdn.microsoft.com/fi-fi/magazine/cc164128%28en-us%29.aspx#S2 que sugiere el uso de subprocesos sin subprocesos. Sin embargo, el artículo trataba sobre un escenario diferente / más complejo y no me ayudó mucho.
Gracias: matti
PD. He hecho esta pregunta también, ¿cuál es la forma correcta de generar subprocesos para la base de datos IO en el servicio web asmx? pero eso era demasiado complejo con múltiples preguntas.
Echa un vistazo a:
Puedes 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);
}