我的风景就像这样
com/novice/to/sql/MyClass.java
因为等待db.SaveChangesAsync()等待直到对数据库进行所有更改(可能需要一些时间)并且我不想等待,但是在并行中我想在其他日志条件下面创建WHILE SaveChanges正在保存更改,我为什么要使用等待?如果我不使用等待,我会收到下图中的图片。
答案 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!