私はSaveChanges
とSaveChangesAsync
を持つASP.NETコアとEFコアを使用しています。EFの非同期SaveChangesから非同期メソッドを安全に呼び出す方法を教えてください。
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()
次のとおりです。
私DbContext
で、データベースに保存する前に、私はいくつかの監査/ロギングを実行します。
私はいつも「非同期でダウン」していますが、ここでは不可能です。私はLogAndAudit()
とLogAndAuditAsync()
を持つように再設計することができますが、それはDRYではないので、私に属していない他の大部分のコードを変更する必要があります。
このトピックに関するその他の多くの質問があり、すべてが一般的で複雑であり、議論の余地があります。 この特定のケースで最も安全なアプローチを知る必要があります。
したがって、SaveChanges()
では、どのように安全かつ同期的に非同期メソッドをデッドロックなしで呼び出すことができますか?
あなたはTask.Run(a)=> {...})を待っていますか? –
@H.Herzlはいそうです。しかし、それをコンパイルしたり実行したりすることはできません。この特定のケースでは、デッドロックの可能性を避ける*最も安全な方法*が何であるかを知る必要があります。 sync-over-asyncを間違ってしまうのは簡単です。 – grokky
問題を回避するために、ログ/監査にキューを使用することは可能ですか?ログ/監査操作は性質上非同期になりますので、非同期/待機は一切必要ありません。 – Menahem