ठीक है, यह अजीब लगता है, लेकिन कोड बहुत सरल है और स्थिति को अच्छी तरह से समझाता है।
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 विधि कॉल श्रृंखला को संभालने का एक बेहतर तरीका है?