কীভাবে অ্যাসিঙ্ক অপারেশন / কর্টাইনগুলির জন্য অপেক্ষা করবেন?


11

আমি সি # 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এটি ব্যবহার করছে, তবে ডকুমেন্টেশনে কাস্টম অপারেশন তৈরি করা বা বিদ্যমান কার্টাইনগুলি মোড়ানো ইত্যাদি সম্পর্কে পুরোপুরি কিছুই নেই etc.

সুতরাং, কাস্টম কর্টিনগুলির জন্য একটি সাধারণ, জেনেরিক এবং পুনরায় পরিবর্তনযোগ্য "প্রতীক্ষা" তৈরির উপায় আছে কি?


সম্ভবত প্রতিবিম্ব এবং কলব্যাক ব্যবহার করবেন? একটি কর্টিনগুলিতে দুটি পদ্ধতি পাস করুন। প্রথম এক পদ্ধতিতে। এটি শেষ হয়ে গেলে প্রতিচ্ছবিটি ব্যবহার করুন, তারপরে দ্বিতীয়টিকে কল করুন
এভোরর

উত্তর:


2
yield return StartCoroutine(yourIEnumatorMethod());

আপনার পদ্ধতিটি শেষ না হওয়া পর্যন্ত অপেক্ষা করবেন, কেবলমাত্র সমাধানের জন্য অসুবিধাই হ'ল এটি আপনাকে কোনও IEnumatorপদ্ধতির মধ্যে এই কল করতে বাধ্য করে ।

Http://docs.unity3d.com/ScriptReferences/Coroutine.html দেখুন


আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.