我有一些使用.net mvc4编写的webapi并使用EF6,现在我所有的api控制器都不是异步的,我想使用EF6的SaveChangesAsync功能
我的api看起来像是
public HttpResponseMessage Post(#some argument)
{
///so some computation and db operations without saving them
// here i want to save all the db operations i had done above
db.SaveChangesAsync();//Task 1
// again do some computation
// wait for operation(Task1) to get complelte
//do some computation
}
如何在不实际将每个api控制器更改为异步的情况下使用EF6 SaveChangesAsync()功能。
答案 0 :(得分:1)
SaveChangesAsync
会返回Task
,因此您只需在确认完成后点Task.Wait()
即可。您无需将方法更改为async
即可执行此操作。
public HttpResponseMessage Post(#some argument)
{
Task saveTask = null;
///so some computation and db operations without saving them
bool shouldSave1 = doCalcs(onState);
if (shouldSave1) {
// here i want to save all the db operations i had done above
saveTask = db.SaveChangesAsync(); //Task 1
}
// again do some computation
if (shouldSave1) {
// wait for operation(Task1) to get complete
saveTask.Wait(); // this blocks until the task completes
}
//do some computation
}
此答案仅向您展示如何在需要时执行此操作。在这种特殊情况下(直接在动作中调用SaveChangesAsync
)它将起作用。它没有讨论你是否应该这样做:在很多情况下Wait
从异步方法返回的Task
会使ApiController
操作的请求上下文死锁。因此,下面的代码不合适。有关示例,请参阅Stephen Cleary: Don't Block on Async Code。