【问题标题】:MVC handle exception from a child async methodMVC 处理来自子异步方法的异常
【发布时间】:2014-12-02 12:23:16
【问题描述】:

如何处理 MVC 中子动作线程的异常?

在此示例中,来自 MakePayment 方法的异常未由调用操作的 catch 处理:

控制器中的操作:

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);
}

支付类:

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;       

     });
  }
}

感谢您的指导。

【问题讨论】:

  • 是什么让你认为异常被抛出而不被处理?
  • 通过在 ASP.NET 应用程序中使用“Task.Run”,您付出了复杂性和线程切换的成本,却没有任何好处。

标签: asp.net-mvc exception-handling async-await


【解决方案1】:

我知道这是一个老问题,但我暂时不支持 cmets 中的说明。

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

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

【讨论】:

    猜你喜欢
    • 2014-01-30
    • 2016-12-17
    • 1970-01-01
    • 2014-04-02
    • 2012-03-23
    • 2019-08-29
    • 1970-01-01
    • 2018-07-19
    • 1970-01-01
    相关资源
    最近更新 更多