Asp Mvc 5异步/等待问题

时间:2016-09-27 06:10:06

标签: c# asp.net-mvc async-await

public async Task<ActionResult> Index()
{
    var service = new CoreServiceFactory().GetImpersonatingService();
    try
    {
        var data = new Impersonation()
        {
            ImpersonatingId = "dac733c3-01ad-447b-b0df-3a7c21fef90b",
            UserId = "dac733c3-01ad-447b-b0df-3a7c21fef90b"
        };
       var imp = await service.Add(data);

    }catch(Exception ex) { throw ex; }
    return View();
}

上面是我的控制器动作方法之一。当插入成功时,这很好用。如果数据已存在于数据库中(唯一约束),则此操作将失败。因此,当我故意尝试使其失败时(我在数据库中手动添加相同的记录,然后尝试通过此操作方法再次添加它),操作方法进入循环或其他东西,异常永远不会抛出,chrome让我向我展示加载图标,看起来它进入了一些死锁状态。有人可以帮我理解为什么它会在抛出异常时进入死锁状态,我该如何处理呢?

以下是参考方法

service.Add(数据)

public async Task<Impersonation> Add(Impersonation t)
{
    if (ValidateData(t))
    {
        using (var uow = GetUnitOfWork())
        {
            var r = GetRepository(uow);
            var item = r.Add(t);
            try
            {
                var ret = await uow.Save();
                if (ret  > 0)
                {
                    return item;
                }
                else
                {
                    return null;
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
    }
    else
    {
        throw new ValidationException(null, "error");

    }

}

uow.Save()

 public class BaseUnitOfWork : IUnitOfWork
  {
        public DbContext _Context { get; private set; }


        public BaseUnitOfWork(DbContext context)
        {

            this._Context = context;
        }

        public async Task<int> Save()
        {
            try
            {
                var ret =  await this._Context.SaveChangesAsync();
                return ret;
            }catch(Exception ex)
            {
                throw ex;
            }
          }
    }

1 个答案:

答案 0 :(得分:0)

这是我的建议:在uow.Save中,在catch块中记录错误并返回零(不要抛出任何异常)。

public class BaseUnitOfWork : IUnitOfWork
  {
        public DbContext _Context { get; private set; }


        public BaseUnitOfWork(DbContext context)
        {

            this._Context = context;
        }

        public async Task<int> Save()
        {
            try
            {
                var ret =  await this._Context.SaveChangesAsync();
                return ret;
            }catch(Exception ex)
            {
                // log the error here 
                return 0;
            }
          }
    }

我不确定在添加服务中返回null是否是个好主意,您可能需要以不同的方式处理它。