请解释 C# 中的协程概念,并说明如何在 C# 中实现一个基本的协程机制?
考察说明
考查对 C# 协程概念的理解及实际实现能力。
回答思路
- 【回答框架 1】C# 协程是一种特殊的函数,可以在执行过程中暂停并恢复,从而支持非阻塞式异步或协作式多任务。它与线程不同,协程是单线程内的协作调度,通过显式让出执行权实现并发。
- 【回答框架 2】在 C# 中,常用迭代器方法(yield return)模拟协程。编译器会将迭代器方法转换为状态机,每次调用 MoveNext 时执行到下一个 yield return 并暂停,实现简单的协程功能。
- 【回答框架 3】从 C# 5 开始,async/await 提供了更强大的异步编程模型,但其本质与协程不同。async 方法返回 Task,由线程池或事件循环调度,而协程通常在同一线程内协作。
- 【回答框架 4】实现简单协程的步骤:定义一个返回 IEnumerable 或 IEnumerator 的方法,在方法内使用 yield return 来返回中间结果;调用方通过 foreach 或手动调用 MoveNext 来推动执行。
- 【关键点 1】协程是协作式多任务,通过让出执行权来暂停和恢复。
- 【关键点 2】yield return 是 C# 实现协程的常用手段,编译器自动生成状态机。
- 【关键点 3】async/await 是基于任务的异步模式,与协程概念不同。
- 【易错点 1】不要混淆协程与线程,协程不提供并行执行。
- 【易错点 2】yield 只能用于迭代器方法,不能在普通方法中使用。
- 【易错点 3】async/await 不完全是协程,它是基于任务的异步编程模式。