我最近一直在学习如何使用实体框架的异步调用,并一直在尝试各种调用的行为。然而,我遇到了一个问题,我不确定是什么原因造成的
因此,在我的数据访问类中,我有一个异步方法,如下所示:
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();
}