迭代器非同步等待與Unity協程
阿新 • • 發佈:2018-12-16
迭代器非同步等待
在Yield關鍵字與迭代器一文中有提到過用迭代器來實現5次迴圈的非同步等待操作,但是如果我們需要實現一定時間段的非同步等待操作,又該怎麼用迭代器來實現呢?
對於這樣一定時長的非同步等待操作,可以在迭代器中開啟一個迴圈,並設定一個時間判斷,當判斷不通過時,迭代器永遠都在迴圈中自我迭代,不會執行後續操作,而當判斷通過時,迭代器跳出迴圈,執行一定時長的非同步等待操作。
class IteratorWorkflow
{
static DateTime current;
static IEnumerator<int> GetEnumerable()
{
while(true)
{
if (DateTime.Now.Subtract(current).TotalMilliseconds > 1000)
break;
yield return 1;
}
Console.WriteLine("Hello Iterator");
}
public static void Main()
{
IEnumerator<int> iterator = GetEnumerable();
current = DateTime.Now;
while (true)
{
Console.WriteLine("Hello World");
bool result = iterator.MoveNext();
}
}
}
Unity協程
Unity協程也是用迭代器來實現的,不過提供了更好的封裝效果和呼叫介面。在Unity協程中,可以選擇多種方式的等待,具體的方式可以參考這篇 部落格。類似上面的做法,我們可以更加簡單地使用Unity協程來實現一定時間的非同步等待效果。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;
using UnityEngine.UI;
public class Wait : MonoBehaviour
{
void Start ()
{
StartCoroutine(waitCreate(0.5f));
}
void Update()
{
print("Hello World");
}
private IEnumerator waitCreate(float seconds)
{
yield return new WaitForSeconds(seconds);
print("Hello Iterator");
}
}