【问题标题】:Deadlock using TryUpdateModelAsync() in MVC 6 ASP.NET 5 beta 4在 MVC 6 ASP.NET 5 beta 4 中使用 TryUpdateModelAsync() 死锁
【发布时间】:2015-05-07 22:37:22
【问题描述】:

从 Beta3 升级到 Beta4 后,我现在在调用 TryUpdateModelAsync 时遇到了死锁(网站无限期挂起)

public ActionResult Edit(ContactModel contactModel)
    {
        var contact = db.Contact.Find(contactModel.ContactId);

        if (ModelState.IsValid)
        {
            TryUpdateModelAsync(contact);
            var result = db.SaveChanges(() => { });

            if (result.Success)
                return RedirectToAction("Details", "Client", new { id = contact.ClientId });
        }
        return View(contactModel);
    }

上面的原始代码是从 MVC 5 移植的,所以我只是想同步运行。像这样将控制器方法转换为异步后,我得到了相同的结果

public async System.Threading.Tasks.Task<ActionResult> Edit(ContactModel contactModel)
    {
        var contact = db.Contact.Find(contactModel.ContactId);

        if (ModelState.IsValid)
        {
            var updateResult = await TryUpdateModelAsync(contact);
            var result = db.SaveChanges(() => { });

            if (result.Success)
                return RedirectToAction("Details", "Client", new { id = contact.ClientId });
        }
        return View(contactModel);
    }

我快速浏览了示例项目,但找不到此方法的任何用法,有人有工作示例吗?或者知道为什么会这样?

【问题讨论】:

  • 为什么第二个不能“正常工作”?
  • @StephenCleary SaveChanges 不会在模型更新之前运行吗?
  • 不,await之后的一切都是任务的继续。
  • 有道理,为了清楚起见,我将编辑问题以删除该评论
  • 问题在哪里?您是否尝试过闯入流程?

标签: c# asp.net-core asp.net-core-mvc


【解决方案1】:

这里是 try update model async 的使用示例(在 MVC 测试代码中),注意这是来自 dev 分支。您可能必须切换到您所在的任何分支。

https://github.com/aspnet/Mvc/blob/dev/test/WebSites/ModelBindingWebSite/Controllers/TryUpdateModelController.cs

您的第一个示例很糟糕,因为在没有等待的情况下异步更新模型会创建一个任务,但会继续执行下一个方法。

要弄清楚为什么你有一个死锁你想打破死锁并查看堆栈在哪里,它与tryupdatemodel有关系吗?

如果您可以在一个小项目中创建一个简单的重现,请在https://github.com/aspnet/mvc/issues 中提交一个错误

【讨论】:

    猜你喜欢
    • 2015-09-22
    • 1970-01-01
    • 1970-01-01
    • 2016-01-24
    • 1970-01-01
    • 2015-11-21
    • 1970-01-01
    • 1970-01-01
    • 2016-02-04
    相关资源
    最近更新 更多