MVC应用程序在使用任务时挂起.使用实体框架时保存更改同步



我最近一直在学习如何使用实体框架的异步调用,并一直在尝试各种调用的行为。然而,我遇到了一个问题,我不确定是什么原因造成的

因此,在我的数据访问类中,我有一个异步方法,如下所示:

public static async Task update(int id)
{
var task1 = doSomething(id);
var task2 = doSomethingElse(id);
await Task.WhenAll(task1, task2);    
}

它调用以下形式的两个异步任务:

private static async Task doSomething(int id)
{
using (var context = new dbEntity())
{
//...make changes to the context
await context.SaveChangesAsync();
}
}
private static async Task doSomethingElse(int id)
{
using (var context = new dbEntity())
{
//...make changes to the context
await context.SaveChangesAsync();
}
}

最后,在控制器中,我调用数据访问异步任务,如下所示:

public ActionResult Index(int id)
{
var task = DataAccess.update(id);
task.Wait();
return View();
}

当我去触发索引操作时,我的应用程序会无限期挂起。奇怪的是,当我停止应用程序并查看数据库时,似乎两个异步SaveChanges都通过了,数据库中的数据也被修改了。当我删除对任务的调用时。Wait(),则应用程序照常进行。我想我在某个地方造成了僵局,但我不知道在哪里。有人能告诉我正确的方向吗?告诉我这里到底发生了什么?

谢谢!

不能将异步代码与同步代码混合使用。当您使用task.wait()时,您正在阻塞线程。

请将控制器操作更改为以下内容:

public async Task<ActionResult> Index(int id)
{
await DataAccess.update(id);
return View();
}

我很想知道它为什么会停滞,但您仍然应该将Index方法更改为异步方法来完成管道。。。

public async Task<ActionResult> Index(int id)
{
await DataAccess.update(id);
return View();
}

最新更新