Tôi đang sử dụng ASP.NET Core và EF Core có SaveChanges
và SaveChangesAsync
.Làm cách nào để gọi một cách an toàn phương thức không đồng bộ từ các SaveChanges không đồng bộ của EF?
Trước khi lưu vào cơ sở dữ liệu, trong DbContext
của tôi, tôi thực hiện một số kiểm toán/logging:
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();
}
Vấn đề là đồng bộ SaveChanges()
.
Tôi luôn làm "không đồng bộ tất cả các con đường xuống", nhưng ở đây điều đó là không thể. Tôi có thể thiết kế lại để có LogAndAudit()
và LogAndAuditAsync()
nhưng đó không phải là DRY và tôi sẽ cần phải thay đổi một tá phần lớn mã khác không thuộc về tôi.
Có rất nhiều câu hỏi khác về chủ đề này và tất cả đều chung và phức tạp và đầy tranh luận. Tôi cần biết cách tiếp cận an toàn nhất trong trường hợp cụ thể này.
Vì vậy, trong SaveChanges()
, làm cách nào để gọi một cách an toàn và đồng bộ một phương thức không đồng bộ, mà không có deadlock?
Bạn đã thử sử dụng công việc chờ đợi Task.Run (() => {...}); –
@ H.Herzl Đúng vậy. Nhưng nó không phải là tôi không thể làm cho nó để biên dịch, hoặc để chạy. Đó là điều tôi cần biết, trong trường hợp cụ thể này, cách an toàn nhất * là gì, giúp tránh được khả năng gây chết người. Thật dễ dàng để có được đồng bộ hóa trên async rất sai. – grokky
Sidestepping vấn đề, là nó có thể sử dụng một hàng đợi cho việc đăng nhập/kiểm toán và sau đó hoạt động đăng nhập/kiểm toán trở thành async của thiên nhiên, vì vậy bạn không cần async/await có ở tất cả? – Menahem