Cでの収益の使用法#

**

イールドリターンエフェクト-リターン時に現在の関数の状態を保存し、次の呼び出し時に現在の位置から処理を続行します

**

利点:ループを処理する場合、メイン関数が処理するデータを生成するたびに、データを返すことができます。シングルスレッドプログラムでは、すべてのデータが処理されるのを待ってから戻る必要がないため、メモリフットプリントを削減できます。
たとえば、複数のデータがある場合、戻り値が一度に処理されると、最初に大量のメモリを開く必要があり、各戻り値に必要なメモリユニットは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();
        }
    }

演算結果:
ここに画像の説明を挿入

元の記事を13件公開しました 賞賛されました0 訪問者4643

おすすめ

転載: blog.csdn.net/qq_37869796/article/details/103920384