C#並列計算テスト

2927 ワード

 using System.Threading.Tasks;

    class Program
    {
        static void Main(string[] args)
        {
            //aa();
            //bb();

            //Parallel.For(0, 100, (x) => // 
            //{
            //    Console.WriteLine(x);
            //});

            var list = GetProcuctList();
            Parallel.For(0, 100, (x, loopstate) =>
            {
                if (x < 50)
                    Console.WriteLine(x);
                else
                {
                    loopstate.Break();
                    return;
                }
            });

            Console.ReadKey();
        }

        private static void aa()
        {
            List<int> arrlist = new List<int>();

            Enumerable.Range(0, 100)
            .AsParallel()
            .ForAll((x) =>
            {
                if (x % 2 == 0 && (x + 1) % 3 == 0)
                {
                    arrlist.Add(x);
                }
            });

            arrlist.ForEach((x) => Console.WriteLine(x));
        }

        private static void bb()
        {
            List<Product> ProductList = GetProcuctList();
            Parallel.ForEach(ProductList, (model) =>
            {
                Console.WriteLine(model.Name);
            });
        }

        private static List<Product> GetProcuctList()
        {
            List<Product> result = new List<Product>();
            for (int index = 1; index < 100; index++)
            {
                Product model = new Product();
                model.Category = "Category" + index;
                model.Name = "Name" + index;
                model.SellPrice = index;
                result.Add(model);
            }
            return result;
        }
    }

    class Product
    {
        public string Name { get; set; }
        public string Category { get; set; }
        public int SellPrice { get; set; }
    }

Stopを呼び出し、Parallelを表します.Forの実行は、他の実行ユニットが停止条件に達しているかどうかにかかわらず、すぐに停止します.一方、我々がBreakを使用すると、条件を満たす現在の実行手段は直ちに停止し、他の実行手段についても、停止条件を満たすものはBreakによって停止し、他の停止条件を満たさないものは引き続き実行し、すべての実行が完了し、自然に停止する.すべての実行ユニットが停止すると、Parallel.Form関数が停止して終了します.
breakはforのcontinueに似ており、stopはforのbreakに似ている.
以下の内容はMSDNに抜粋します.
各値に対してbody依頼を1回呼び出し、反復範囲(fromIncluusive,toExclusive)にします.反復回数(Int 32)と、ループを早期に終了するために使用できるParallelLoopStateインスタンスのパラメータがあります.現在の反復を実行する必要がない場合、Breakメソッドを呼び出してfor操作反復を通知します.ただし、現在の反復の前のすべての反復は、まだ実行されていない場合は、実行する必要があります.したがって、Breakを呼び出すことは、C#などの言語の従来のforループで使用されている割り込み操作と似ていますが、現在の反復以降の反復が実行されないことは保証されません.現在の反復が不要になる前にすべての反復を実行する場合は、BreakではなくStopメソッドを使用します.Stopを呼び出すと、forループが現在の反復の上にあるか下にあるかにかかわらず、すべての必要な作業が完了しているため、残りの反復をすべて放棄する可能性があることが通知されます.しかしBreakでは,他の反復を実行しないという保証はない.ループが早期に終了すると、返されるParallelLoopResult構造には、ループの完了に関する情報が含まれます.fromInclusiveがtoExclusive以上である場合、このメソッドは反復を実行することなくすぐに返されます.