2010-10-05 31 views
5

Quiero ejecutar código de una acción de controlador MVC de ASP.NET en un hilo nuevo/asincrónicamente. No me importa la respuesta, quiero disparar y olvidar y devolver al usuario una vista mientras el método async se ejecuta en segundo plano. Pensé que la clase BackgroundWorker era apropiada para esto?backgroundworker bloqueando la acción del controlador MVC

public ActionResult MyAction() 
{ 
    var backgroundWorker = new BackgroundWorker(); 
    backgroundWorker.DoWork += Foo; 
    backgroundWorker.RunWorkerAsync(); 

    return View("Thankyou"); 
} 

void Foo(object sender, DoWorkEventArgs e) 
{ 
    Thread.Sleep(10000); 
} 

¿Por qué este código causa que haya un retraso de 10 segundos antes de devolver la Vista? ¿Por qué no se devuelve la vista al instante?

Más al punto, ¿qué tengo que hacer para que esto funcione?

Gracias

Respuesta

7

Usted sólo puede iniciar un nuevo hilo:

public ActionResult MyAction() 
{ 
    var workingThread = new Thread(Foo); 
    workingThread.Start(); 

    return View("Thankyou"); 
} 

void Foo() 
{ 
    Thread.Sleep(10000); 
} 
+0

Cheers, preguntando por qué el fondo trabajó bloques sin embargo? –

+1

Puede ver el código de souvenir de BackgroundWorker para averiguarlo. BackgroundWorker es el componente WinForms y creo que no es correcto usarlo en ASP.NET. – bniwredyc

+3

En lugar de renovar subprocesos manualmente, probablemente debería usar ThreadPool.QueueUserWorkItem –

Cuestiones relacionadas