TestYield.cs 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using UnityEngine;
  6. public class TestYield : MonoBehaviour
  7. {
  8. static IEnumerable<int> WithNoYield()
  9. {
  10. IList<int> list = new List<int>();
  11. for (int i = 0; i < 20; i++)
  12. {
  13. LogHelper.Log("WithNoYield Quary " + i.ToString());
  14. if (i > 2)
  15. list.Add(i);
  16. }
  17. return list;
  18. }
  19. static IEnumerable<int> WithYield()
  20. {
  21. for (int i = 0; i < 20; i++)
  22. {
  23. LogHelper.Log("WithYield Quary " + i.ToString());
  24. if (i > 2)
  25. yield return i;
  26. }
  27. }
  28. void Start()
  29. {
  30. LogHelper.Log("------------------ WithNoYield--------------");
  31. WithNoYield();
  32. LogHelper.Log("------------------WithYield--------------");
  33. // 直接调用yield封装的函数不会被执行,会延迟计算
  34. WithYield();
  35. WithYield();
  36. WithYield();
  37. WithYield();
  38. WithYield();
  39. WithYield();
  40. // 执行一次会将控制权从函数里面交出,给外部,如果外部是异步的或者子线程一直循环的被挂起了
  41. // 下次再重入该函数,那么该yield函数的调用堆栈状态会被保留,从而接着上次状态继续执行
  42. LogHelper.Log("------------------ foreach WithNoYield--------------");
  43. foreach (int i in WithNoYield())
  44. {
  45. LogHelper.Log("Result " + i.ToString());
  46. }
  47. // 如果yield迭代器全部执行完了,再重新进来不会保留堆栈信息
  48. LogHelper.Log("------------------ foreach WithYield1--------------");
  49. foreach (int i in WithYield())
  50. {
  51. Console.WriteLine("Result " + i.ToString());
  52. if (i == 10)
  53. {
  54. break;
  55. }
  56. }
  57. LogHelper.Log("------------------ foreach WithYield2-------------");
  58. foreach (int i in WithYield())
  59. {
  60. LogHelper.Log("Result " + i.ToString());
  61. }
  62. LogHelper.Log("-----------------------------------------");
  63. }
  64. }