将SaveChangesAsync功能与非异步webapi一起使用

时间:2014-05-23 09:32:01

标签: entity-framework asp.net-mvc-4 asp.net-web-api

我有一些使用.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()功能。

1 个答案:

答案 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