Async ऑपरेशंस / कोरआउट्स का इंतजार कैसे करें?


11

मैं C # 5 के awaitकीवर्ड के अनुरूप यूनिटी 5 में समाप्त होने के लिए कोरआउट और अतुल्यकालिक संचालन की प्रतीक्षा करने के लिए एक सामान्य / पुन: प्रयोज्य तरीके की तलाश कर रहा हूं ।

सबसे आसान तरीका जो मैं सोच सकता हूं वह कुछ इस तरह है:

 public class SomeUtility {
     public bool IsDoingSomething { get; private set; }

     public IEnumerator DoSomethingAsync() {
         IsDoingSomething = true;
         yield return new WaitForSeconds(2);
         IsDoingSomething = false;
     }
 }

और फिर एक और कोरआउट में:

 while(!someUtilityInstance.IsDoingSomething)
     yield return null;

हालांकि यह बहुत अच्छा नहीं है क्योंकि यह whileबयानों के साथ कोड को बंद कर देता है, पुन: प्रयोज्य नहीं है (उदाहरणों और सरल उपयोगिता कार्यों के लिए भी समर्पित वर्गों की जरूरत है!) और बहुत सारे सिंगलटन या स्थिर सामान जहां इसकी आवश्यकता भी नहीं है।

निकटतम मैंने पाया एकता का उपयोग कर रहा है AsyncOperation। यह यहाँ बहुत अच्छी तरह से काम करता है:

public static IEnumerator Await(this AsyncOperation operation) {
    while(!operation.isDone)
        yield return operation;
}

yield return SceneManager.LoadLevelAsync("blaaaah").Await();

हालाँकि .. समस्या यह है: कैसे बनाएँ AsyncOperation? उदाहरण के लिए कुछ सेवाएं, इसका SceneManagerउपयोग कर रही हैं, लेकिन दस्तावेज में कस्टम ऑपरेशन बनाने या मौजूदा कोरआउट्स को लपेटने आदि के बारे में पूरी तरह से कमी है।

तो, क्या कस्टम कोराउटाइन के लिए एक सरल, सामान्य और resuable "प्रतीक्षा" बनाने का एक तरीका है?


शायद प्रतिबिंब और कॉलबैक का उपयोग करें? दो तरीकों को कोरटाइन में पास करें। पहले एक विधि करने के लिए। यह पूरा होने पर देखने के लिए प्रतिबिंब का उपयोग करें, फिर दूसरे को कॉल करें
Evorlor

जवाबों:


2
yield return StartCoroutine(yourIEnumatorMethod());

तब तक इंतजार करेंगे जब तक आपकी विधि पूरी नहीं हो जाती है, उस समाधान के साथ एकमात्र असुविधा यह है कि यह आपको एक IEnumatorविधि के भीतर यह कॉल करने के लिए मजबूर करती है।

Http://docs.unity3d.com/ScriptReference/Coroutine.html देखें


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.