2010-08-24 20 views
5

Dentro de un controlador de asp.net mvc 2, tengo el siguiente código:es un trabajador de fondo en un controlador asíncrono?

using (BackgroundWorker worker = new BackgroundWorker()) 
         { 
          worker.DoWork += new DoWorkEventHandler(blah); 
          worker.RunWorkerAsync(var); 
         } 

Mi pregunta es: es el código asíncrono, lo que significa que lanza un nuevo hilo y el controlador devuelve la vista mientras 'bla' es ejecutando en paralelo?

De lo contrario, ¿cómo puedo lograr estos resultados?

Respuesta

7

En MVC 2 hay una nueva característica llamada AsyncController que es la forma correcta de hacer llamadas asincrónicas en MVC. Su controlador debe heredar de AsyncController en lugar de controlador. Entonces tu nombre de método de acción primario debería tener "Async" al final. por ejemplo, si usted tenía un método de acción llamado Bla(), que nombre en BlahAsync() en su lugar y esto es reconocido automáticamente por el marco (y utilizar BlahCompleted() para la devolución de llamada):

public virtual void BlahAsync() 
{ 
    AsyncManager.OutstandingOperations.Increment(); 
    var service = new SomeWebService(); 
    service.GetBlahCompleted += (sender, e) => 
     { 
      AsyncManager.Parameters["blahs"] = e.Result; 
      AsyncManager.OutstandingOperations.Decrement(); 
     }; 
    service.GetBlahAsync(); 
} 

public virtual ActionResult BlahCompleted(Blah[] blahs) 
{ 
    this.ViewData.Model = blahs; 
    return this.View(); 
} 

Más información en el AsyncController aquí: MVC AsyncController

0

no estoy seguro de que esto va a funcionar para usted (no estoy diciendo que no lo hará , sólo que no estoy seguro de ).

La respuesta corta es , el código es asincrónico. Pero para obtener cualquier tipo de valor de retorno de BackgroundWorker, necesita manejar su evento RunWorkerCompleted.

El mecanismo básico es poner algún valor en la propiedad e.Result en su caso DoWork, y luego a recuperarlo de la propiedad e.Result en su caso RunWorkerCompleted (asegurándose de comprobar primero e.Error para ver si ha generado una excepción en DoWork)

La razón por la que no estoy seguro de si funcionará es que está utilizando la palabra clave using, que asegura que el BackgroundWorker se elimina al final del bloque de código. Dado que está realizando su trabajo de forma asíncrona, esto puede o no evitar que tenga la oportunidad de manejar RunWorkerCompleted. Realmente no estoy seguro, ¿tal vez alguien más lo sabe?

0

Creo que probablemente se encontrará con problemas, ya que tratará de deshacerse del trabajador mientras el hilo de fondo todavía está en uso. Si nada más, comportamiento impredecible.

1

BackgroundWorker no es realmente lo que quiere aquí: no hay una interfaz de usuario para actualizar con llamadas devueltas. Solo desea desconectar un elemento de trabajo a un hilo del grupo de subprocesos y continuar.

El método ThreadPool.QueueUserWorkItem es probablemente una mejor opción aquí, o use el nuevo enfoque paralelo de Tarea: Task.Factory.StartNew(...).

Cuestiones relacionadas