मैं एएसपी.नेट कोर और ईएफ कोर का उपयोग कर रहा हूं जिसमें SaveChanges
और SaveChangesAsync
है।मैं ईएफ के गैर-एसिंक 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()
में, मैं सुरक्षित रूप से और सिंक्रनाइज़ रूप से डेडलॉक्स के बिना एसिंक विधि को कैसे कॉल करूं?
क्या आपने प्रतीक्षा की कोशिश की कोशिश की है। Run (() => {...}); –
@ एच। हेर्ज़ल हाँ जो काम करता है। लेकिन ऐसा नहीं है कि मैं इसे संकलित करने या चलाने के लिए नहीं मिल सकता। यह है कि मुझे यह जानने की जरूरत है कि, इस विशेष मामले में, * सबसे सुरक्षित तरीका * क्या है, जो डेडलॉक्स की संभावना से बचाता है। सिंक-ओवर-एसिंक बहुत गलत हो जाना आसान है। – grokky
समस्या को सिस्टेप करना, क्या लॉगिंग/ऑडिटिंग के लिए कतार का उपयोग करना संभव है और फिर लॉग/ऑडिट ऑपरेशन प्रकृति द्वारा एसिंक हो जाता है, इसलिए आपको एसिंक/बिल्कुल प्रतीक्षा करने की आवश्यकता नहीं है? – Menahem