मुझे पता है कि यह एक पुराना सवाल है, लेकिन मैं इसका एक उदाहरण पेश करना चाहता हूं कि उपज कीवर्ड का रचनात्मक उपयोग कैसे किया जा सकता है। मुझे इस तकनीक से वास्तव में फायदा हुआ है। उम्मीद है कि यह किसी और के लिए भी मददगार होगा जो इस सवाल पर लड़ता है।
नोट: उपज कीवर्ड के बारे में मत सोचो कि केवल एक संग्रह बनाने का दूसरा तरीका है। उपज की शक्ति का एक बड़ा हिस्सा इस तथ्य में आता है कि निष्पादन तब तक आपकी विधि या संपत्ति में रोक दिया जाता है जब तक कि कॉलिंग कोड अगले मूल्य से अधिक न हो जाए। यहाँ मेरा उदाहरण है:
उपज कीवर्ड का उपयोग करते हुए (रोब ईसेनबर्ग के कैलिबर्न.माइक्रो कोरटाइन्स कार्यान्वयन के साथ) मुझे इस तरह एक वेब सेवा के लिए एक अतुल्यकालिक कॉल व्यक्त करने की अनुमति देता है:
public IEnumerable<IResult> HandleButtonClick() {
yield return Show.Busy();
var loginCall = new LoginResult(wsClient, Username, Password);
yield return loginCall;
this.IsLoggedIn = loginCall.Success;
yield return Show.NotBusy();
}
यह क्या करेगा मेरे बिजीइंडिएटर को चालू करें, मेरी वेब सेवा पर लॉग इन विधि को कॉल करें, मेरे इस्लेगेड को ध्वज को वापसी मान पर सेट करें, और फिर बिजीइंडिलेटर को वापस बंद करें।
यहां बताया गया है कि यह कैसे काम करता है: IResult में एक निष्पादित विधि और एक पूर्ण घटना है। Caliburn.Micro IEleumerator को CallleButtonClick () के कॉल से पकड़ लेता है और इसे Coroutine.BeginExecute विधि में पास कर देता है। BeginExecute विधि IResults के माध्यम से चलना शुरू करता है। जब पहला IResult वापस आ जाता है, तो HandleButtonClick () के अंदर निष्पादन रोक दिया जाता है, और BeginExecute () एक ईवेंट हैंडलर को कंप्लीट इवेंट में अटैच करता है और एक्सक्यूट () कहता है। IResult.Execute () या तो एक सिंक्रोनस या एक एसिंक्रोनस कार्य कर सकता है और पूरा होने वाली घटना को पूरा करता है।
LoginResult कुछ इस तरह दिखता है:
public LoginResult : IResult {
// Constructor to set private members...
public void Execute(ActionExecutionContext context) {
wsClient.LoginCompleted += (sender, e) => {
this.Success = e.Result;
Completed(this, new ResultCompletionEventArgs());
};
wsClient.Login(username, password);
}
public event EventHandler<ResultCompletionEventArgs> Completed = delegate { };
public bool Success { get; private set; }
}
यह इस तरह से कुछ स्थापित करने और निष्पादन के माध्यम से यह देखने में मदद कर सकता है कि क्या चल रहा है।
आशा है कि यह किसी को मदद करता है! मैंने वास्तव में विभिन्न तरीकों से खोज करने का आनंद लिया है, जिनका उपयोग किया जा सकता है।
yield
से बंधा हैIEnumerable<T>
और अपनी तरह का है। यह किसी आलसी मूल्यांकन में है