1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374 |
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using UnityEngine;
- public class TestYield : MonoBehaviour
- {
- static IEnumerable<int> WithNoYield()
- {
- IList<int> list = new List<int>();
- for (int i = 0; i < 20; i++)
- {
- LogHelper.Log("WithNoYield Quary " + i.ToString());
- if (i > 2)
- list.Add(i);
- }
- return list;
- }
- static IEnumerable<int> WithYield()
- {
- for (int i = 0; i < 20; i++)
- {
- LogHelper.Log("WithYield Quary " + i.ToString());
- if (i > 2)
- yield return i;
- }
- }
- void Start()
- {
- LogHelper.Log("------------------ WithNoYield--------------");
- WithNoYield();
- LogHelper.Log("------------------WithYield--------------");
- // 直接调用yield封装的函数不会被执行,会延迟计算
- WithYield();
- WithYield();
- WithYield();
- WithYield();
- WithYield();
- WithYield();
- // 执行一次会将控制权从函数里面交出,给外部,如果外部是异步的或者子线程一直循环的被挂起了
- // 下次再重入该函数,那么该yield函数的调用堆栈状态会被保留,从而接着上次状态继续执行
- LogHelper.Log("------------------ foreach WithNoYield--------------");
- foreach (int i in WithNoYield())
- {
- LogHelper.Log("Result " + i.ToString());
- }
- // 如果yield迭代器全部执行完了,再重新进来不会保留堆栈信息
- LogHelper.Log("------------------ foreach WithYield1--------------");
- foreach (int i in WithYield())
- {
- Console.WriteLine("Result " + i.ToString());
- if (i == 10)
- {
- break;
- }
- }
- LogHelper.Log("------------------ foreach WithYield2-------------");
- foreach (int i in WithYield())
- {
- LogHelper.Log("Result " + i.ToString());
- }
- LogHelper.Log("-----------------------------------------");
- }
- }
|