迭代器异步等待
在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");
}
}