2014-10-07 61 views
3

如何处理MVC中的子动作的线程异常?从子异步方法MVC句柄异常

在这个例子中从MakePayment方法的异常没有被调用动作的捕获处理:

动作在控制器:

public async Task<ActionResult> Payment() 
{ 

    try 
    { 
     var tokenId = "12345"; 
     var order = new OrderViewModel 
        { 
         Amount = 10.00, 
         Description = "Widget", 
         Customer = 1       
        }; 

     var payment = new PaymentService(); 
     var model = await payment.MakeCharge(tokenId, order); 

    } 
    catch(Exception ex) 
    { 
     ViewBag.Message = ex.Message.toString(); 
     return view("Failed"); 
    } 

    return View(model); 
} 

Payment类:

public class PaymentService 
{ 
    public async Task<Charge> MakeCharge(string tokenId, OrderViewModel order) 
    { 
    return await Task.Run(() => 
    { 
     var myCharge = new ChargeCreateOptions 
     { 
      Amount = order.Amount, 
      Description = order.Description, 
      TokenId = tokenId 
     }; 

     var chargeService = new ChargeService(); 
     var charge = chargeService.create(mycharge);  

     return charge;  

    }); 
    } 
} 

谢谢你的任何指导。

+2

是什么让你认为抛出异常并且没有被处理? – 2014-10-08 09:57:15

+3

通过在ASP.NET应用程序中使用'Task.Run',您将付出复杂性和线程切换的成本,而没有任何好处。 – 2014-10-08 09:58:50

回答

1

我知道这是一个古老的问题,但我暂时没有支持,如评论中所述。

除了那个无聊的答案,我建议你阅读这篇文章https://msdn.microsoft.com/hu-hu/magazine/dn683793(en-us).aspx关于try/catch异步方法在c#6中的新闻。

现在我看不到任何理由在您的示例中使用Task.Run()。当你应该使用Task.Run()时,一个明显的例子是当你在做CPU同步工作时不想阻塞你的UI线程。你的情况你没有任何UI线程。