ठीक है, यह अजीब लगता है, लेकिन कोड बहुत सरल है और स्थिति को अच्छी तरह से समझाता है।
public virtual async Task RemoveFromRoleAsync(AzureTableUser user, string role)
{
AssertNotDisposed();
var roles = await GetRolesForUser(user);
roles.Roles = RemoveRoles(roles.Roles, role);
await Run(TableOperation.Replace(roles));
}
(मुझे पता है कि मैं नीचे दिए गए सार में बात कर रहा हूं, लेकिन ऊपर वास्तविक विधि कोड होगा जो वास्तव में वही कर रहा है जो मैं यहां पूछ रहा हूं, और मैं वास्तव में आपकी वास्तव में समीक्षा करने में दिलचस्पी रखता हूं। शुद्धता के लिए यह विसिंग / एस्सिट पैटर्न का दृश्य है।)
मैं अब और अधिक बार इस पैटर्न का सामना कर रहा हूं जो कि मैं async
/ await
अधिक का उपयोग कर रहा हूं । पैटर्न में घटनाओं की निम्नलिखित श्रृंखला शामिल है:
- एक प्रारंभिक कॉल का इंतजार करें जो मुझे कुछ जानकारी देता है जिस पर मुझे काम करने की आवश्यकता है
- उस जानकारी पर सिंक्रोनाइज़ करें
- अंतिम कॉल की प्रतीक्षा करें जो अद्यतन किए गए कार्य को सहेजता है
उपरोक्त कोड ब्लॉक आम तौर पर इन तरीकों को संभालने के बारे में है। मैं await
पहला कॉल करता हूं, जो मुझे करना है क्योंकि यह एसिंक्रोनस है। अगला, मैं वह काम करता हूं जो मुझे करने की आवश्यकता है जो IO या संसाधन बाध्य नहीं है, और इसलिए यह async नहीं है। अंत में, मैं अपना काम बचा लेता async
हूं जो एक कॉल भी है , और कार्गो-पंथ से बाहर await
है।
लेकिन क्या इस पैटर्न को संभालने का यह सबसे कुशल / सही तरीका है? ऐसा लगता है कि मैं await
अंतिम कॉल को छोड़ सकता हूं , लेकिन अगर यह विफल रहता है तो क्या होगा? और क्या मुझे मूल कॉल के साथ अपने तुल्यकालिक काम को चेन करने के लिए एक Task
विधि का उपयोग करना चाहिए ContinueWith
? मैं अभी एक बिंदु पर हूं जहां मुझे यकीन नहीं है कि मैं इसे सही तरीके से संभाल रहा हूं।
उदाहरण में कोड को देखते हुए , क्या इस async / सिंक / async विधि कॉल श्रृंखला को संभालने का एक बेहतर तरीका है?