**
イールドリターンエフェクト-リターン時に現在の関数の状態を保存し、次の呼び出し時に現在の位置から処理を続行します
**
利点:ループを処理する場合、メイン関数が処理するデータを生成するたびに、データを返すことができます。シングルスレッドプログラムでは、すべてのデータが処理されるのを待ってから戻る必要がないため、メモリフットプリントを削減できます。
たとえば、複数のデータがある場合、戻り値が一度に処理されると、最初に大量のメモリを開く必要があり、各戻り値に必要なメモリユニットは1つだけです。マルチスレッド処理プログラムでは、プログラムの処理速度も高速化できます。
典型的なアプリケーションはSocketで、メインスレッドはSocketが受信したデータを処理し、別のスレッドはSocketの内容を読み取ります。受信したデータの量が比較的多い場合、2つのスレッドは処理速度を上げることができます。
デモ:
class Program
{
static void Main(string[] args)
{
foreach (var item in GetNumbers())
Console.WriteLine("主线程: 子线程数据 = " + item);
Console.WriteLine("--------------------");
foreach (var item in GetString())
Console.WriteLine("主线程: 子线程数据 = " + item);
}
static IEnumerable<int> GetNumbers()
{
// 以[0, 1, 2] 初始化数列 list
Console.WriteLine("初始化GetNumbers函数...");
List<int> list = new List<int>();
for (int i = 0; i < 3; i++)
list.Add(i);
// 每次 yield return 返回一个数据
Console.WriteLine("执行子线程...");//使用**yield 只从当前执行的位置继续执行**
yield return list[0];
yield return list[1];
yield return list[2];
Console.WriteLine("完成GetNumbers");
}
static IEnumerable<string> GetString()
{
Console.WriteLine("初始化GetString函数...");
List<string> list = new List<string>();
for (int i = 0; i < 3; i++)
list.Add("子项" + (i + 1));
Console.WriteLine("执行子线程...");
foreach (string str in list)//循环中使用**yield 也是只从当前执行的位置继续执行**
{
yield return str;
}
Console.WriteLine("完成GetString");
Console.ReadLine();
}
}
演算結果: