在 C# 中,yield
關鍵字用於定義一個迭代器方法(Iterator Method),
這個方法可以產生一個可枚舉的序列。當迭代器方法被調用時,
它不會立即執行方法體中的程式碼,而是返回一個 IEnumerator
對象。
當使用者對這個 IEnumerator
對象調用 MoveNext()
方法時,才會執行迭代器方法中的程式碼,並返回序列中的下一個元素。
使用 yield
關鍵字可以讓我們更簡潔地定義一個可枚舉的序列,
而不需要手動實現 IEnumerator
和 IEnumerable
接口。
此外,在使用 yield
關鍵字時,我們可以使用 yield break
來提前結束序列的產生。
好的,以下是一個使用 yield
關鍵字定義可枚舉序列的簡單範例:
1 |
|
在這個範例中,我們使用 CountTo
方法定義了一個可枚舉序列,這個序列包含了從 1 到指定的最大值的整數。
在 CountTo
方法中,我們使用 yield return
關鍵字返回序列中的下一個元素,這個方法被調用時不會立即執行,
而是返回一個 IEnumerable<int>
對象。在 Main
方法中,我們使用 foreach
迴圈來枚舉這個序列中的元素,這時才會執行 CountTo
方法中的程式碼並產生序列。
下面是一个使用 Task.Yield() 的简单示例:
1 |
|
在上面的示例中,我们使用 Task.Delay 模拟了一个耗时的操作,然后使用 Task.Yield 让出当前线程,让其他任务先执行。在执行到 Task.Yield() 的时候,控制权会立即返回给调用方,然后在后续的某个时间点继续执行。这个时间点取决于线程池的调度机制,可能是在当前线程执行完毕后,也可能是在其他线程执行完毕后。
当我们运行上面的代码时,输出结果如下:
1 |
|
可以看到,在执行到 Task.Yield() 之前,控制台输出了 “Before Yield”,然后在执行到 Task.Yield() 之后,控制台输出了 “After Yield”,最后输出了 “End”。这表明在调用 Task.Yield() 时,当前线程让出了控制权,其他任务得以先执行,然后在后续的某个时间点继续执行。