我的场景是这样的
//a lot of database dependant processing
db.SaveChangesAsync(); //asynchronouly saving database changes
//a lot of ANOTHER long term database INDEPENDANT stuff
因为await db.SaveChangesAsync()会等待,直到对数据库进行所有更改(可能需要一些时间),我不想等待,但并行地,我想在保存SaveChanges时在下面制作其他日志术语内容变化,为什么要使用await?如果我不使用等待,我会收到下图中的磨损。
最佳答案
此警告非常明确 - 您正在启动一个异步任务,但没有在任务完成时收到通知的机制。如果您稍后确实需要知道它何时完成怎么办?在从方法返回之前,或者在需要确保数据与数据库同步的时刻?
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!
关于entity-framework - 是否必须在异步 EF 上等待 SaveChangesAsync()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43264075/