2011-05-30 10 views
7

Tengo esta ...¿Cómo se maneja una excepción con AsyncController de ASP.net MVC?

public void FooAsync() 
    { 
     AsyncManager.OutstandingOperations.Increment(); 

     Task.Factory.StartNew(() => 
     { 
      try 
      { 
       doSomething.Start(); 
      } 
      catch (Exception e) 
      { 
       AsyncManager.Parameters["exc"] = e; 
      } 
      finally 
      { 
       AsyncManager.OutstandingOperations.Decrement(); 
      } 
     }); 
    } 

    public ActionResult FooCompleted(Exception exc) 
    { 
     if (exc != null) 
     { 
      throw exc; 
     } 

     return View(); 
    } 

¿Hay una mejor manera de pasar una excepción volver a ASP.net?

Cheers, Ian.

Respuesta

5

Task cogerá las excepciones para usted. Si llama task.Wait(), que envolverá toda excepción atrapados en una AggregateException y tirarlo.

[HandleError] 
public void FooAsync() 
{ 
    AsyncManager.OutstandingOperations.Increment(); 
    AsyncManager.Parameters["task"] = Task.Factory.StartNew(() => 
    { 
     try 
     { 
      DoSomething(); 
     } 
     // no "catch" block. "Task" takes care of this for us. 
     finally 
     { 
      AsyncManager.OutstandingOperations.Decrement(); 
     } 
    }); 
} 

public ActionResult FooCompleted(Task task) 
{ 
    // Exception will be re-thrown here... 
    task.Wait(); 

    return View(); 
} 

Simplemente agregando un atributo [HandleError] no es suficiente. Dado que la excepción se produce en un hilo diferente, tenemos que volver a enviar la excepción al subproceso ASP.NET para hacer algo con él. Solo después de que arrojemos la excepción desde el lugar correcto, el atributo [HandleError] podrá hacer su trabajo.

0

trate de poner un atributo de este tipo en la acción FooAsync:

[HandleError (ExceptionType = typeof (MyExceptionType) View = "Exceptions/MyViewException")] 

esta manera se puede crear una vista para mostrar el error detallada para el usuario.

Cuestiones relacionadas