我使用的是ASP.NET Core,以及具有SaveChanges
和SaveChangesAsync
的EF Core。如何從EF的非異步SaveChanges安全地調用異步方法?
之前保存到數據庫中,在我DbContext
,我執行一些審計/日誌:
public async Task LogAndAuditAsync() {
// do async stuff
}
public override int SaveChanges {
/*await*/ LogAndAuditAsync(); // what do I do here???
return base.SaveChanges();
}
public override async Task<int> SaveChangesAsync {
await LogAndAuditAsync();
return await base.SaveChanges();
}
的問題是同步SaveChanges()
。
我總是做「異步下降」,但這是不可能的。我可以重新設計有LogAndAudit()
和LogAndAuditAsync()
,但那不是DRY,我需要更改其他一些不屬於我的主要代碼片段。
關於這個話題還有很多其他的問題,都是普遍而複雜的,充滿了爭議。 我需要知道在這種特定情況下最安全的方法。
那麼,在SaveChanges()
,我該如何安全地同步調用異步方法,而沒有死鎖?
您是否嘗試過使用await Task.Run(()=> {...}); –
@ H.Herzl是的,它的工作原理。但這不是我無法編譯或運行。這就是我需要知道的是,在這種特殊情況下,什麼是最安全的方式,避免了死鎖的可能性。非常容易讓sync-over-async錯誤。 – grokky
避開這個問題,是否可以使用隊列進行日誌記錄/審計,然後日誌/審計操作本質上變得異步,所以您根本不需要異步/等待? – Menahem