是否必须在asyncronous EF上等待SaveChangesAsync()?

时间:2017-04-06 19:22:56

标签: entity-framework asynchronous

我的风景就像这样

com/novice/to/sql/MyClass.java

因为等待db.SaveChangesAsync()等待直到对数据库进行所有更改(可能需要一些时间)并且我不想等待,但是在并行中我想在其他日志条件下面创建WHILE SaveChanges正在保存更改,我为什么要使用等待?如果我不使用等待,我会收到下图中的图片。 enter image description here

1 个答案:

答案 0 :(得分:4)

此警告非常明确 - 您正在启动异步任务,但您没有机制在完成后收到通知。如果您需要知道什么时候完成,以后怎么办?在从方法返回之前,还是在需要确保数据与数据库同步的时​​候?

await操作是确保操作的一种方法,但正如您所说,您不希望在保存数据时停止独立处理。 await用于异步,而不是并行。

此外,await保存任务可确保您捕获数据库引发的任何异常。当您简单地释放任务时,任何异常都会丢失 - 最多,您可以处理TaskScheduler.UnobservedTaskException来处理抛出异常的未观察任务,但更简单的方法是简单地观察任务。

正如您所知,观察任务的一种方法是await。另一种方法是简单地保存Task在变量中返回的SaveChangesAsync对象。这将允许您稍后在该任务上await(或Wait()),捕获其异常(通过尝试/捕获await调用或将ContinueWith附加到任务)并且让编译器休息,因为知道你没有放弃任务到它的命运:

//a lot of database dependant processing
var dbSaveTask = db.SaveChangesAsync(); //asynchronouly saving database changes
//a lot of ANOTHER long term database INDEPENDANT stuff
// now, before assuming the DB is up to date, ensure the TAsk is complete. 
await dbSaveTask;
// now do something Db-dependent!