ホームページ  >  記事  >  バックエンド開発  >  C# 並列タスクの Parallel クラスの紹介例

C# 並列タスクの Parallel クラスの紹介例

零下一度
零下一度オリジナル
2017-06-23 15:13:392248ブラウズ

1. Parallel クラス

Parallel クラスはデータとタスクの並列処理を提供します。

2. Paraller.For() メソッドは C# の for ループ ステートメントに似ており、タスクを複数回実行します。 。反復は Paraller.For() メソッドを使用して並列実行できます。反復の順序は定義されていません。

For() メソッドでは、最初の 2 つのパラメーターは固定されており、これらの 2 つのパラメーターはループの開始と終了を定義します。まず最初のメソッド For(int,int,Action) について説明します。最初の 2 つのパラメーターはループの開始と開始を表します。3 番目のパラメーターはループの反復数です。パラメータが渡される デリゲートに与えられるメソッド。 Paraller.For() メソッドの戻り値の型は ParallelLoopResult 構造体で、ループが終了したかどうかに関する情報と、最下位の反復のインデックスを提供します (Break ステートメントが呼び出された最下位の反復を表す整数を返します)。まず例を書いてみましょう:

            ParallelLoopResult result = Parallel.For(0, 10, i =>{
                Console.WriteLine("迭代次数:{0},任务ID:{1},线程ID:{2}", i, Task.CurrentId, Thread.CurrentThread.ManagedThreadId);
                Thread.Sleep(10);
            });

            Console.WriteLine("是否完成:{0}", result.IsCompleted);
            Console.WriteLine("最低迭代:{0}", result.LowestBreakIteration);
出力結果は次のとおりです:

ご覧のとおり、デリゲート メソッドは 10 回実行されており、順序は保証できません。ただし、最下位の反復ではデータが出力されません。これは、Break ステートメントを呼び出す最下位の反復の整数が返されるためです。ここにはブレークがありません。実行中の早い段階で For() メソッドを中断する必要がある場合は、ParallelLoopState を使用して実装できます (For(int,int,Action))。上記の例を変更します:

            ParallelLoopResult result = Parallel.For(0, 10, (i, state) =>{
                Console.WriteLine("迭代次数:{0},任务ID:{1},线程ID:{2}", i, Task.CurrentId, Thread.CurrentThread.ManagedThreadId);
                Thread.Sleep(10);if (i > 5)
                    state.Break();
            });

            Console.WriteLine("是否完成:{0}", result.IsCompleted);
            Console.WriteLine("最低迭代:{0}", result.LowestBreakIteration);
出力結果は次のとおりです:

3. Parallel.ForEach()

Paraller.ForEach() メソッドは IEnumerable を実装するコレクションを走査し、そのメソッドは類似していますforeach ステートメントに追加されますが、非同期に走査され、走査順序はここでは決定されません。まず最初のメソッド Paraller.ForEach(IEnumerable,Action) を説明し、まず次の例を見てください。

            string[] data = { "str1", "str2", "str3" };
            ParallelLoopResult result = Parallel.ForEach<string>(data, str =>  {
                  Console.WriteLine(str);
              });
            Console.WriteLine("是否完成:{0}", result.IsCompleted);
            Console.WriteLine("最低迭代:{0}", result.LowestBreakIteration);
出力結果は次のとおりです。また、繰り返し回数と ParallelLoopState を渡します。For の場合、メソッドは ForEach(IEnumerablesource,Actionbody) であり、上記の例を変更します

            string[] data = { "str1", "str2", "str3", "str4", "str5" };
            ParallelLoopResult result = Parallel.ForEach<string>(data, (str, state, i) =>  {
                  Console.WriteLine("迭代次数:{0},{1}", i, str);                  if (i > 3)
                      state.Break();
              });
            Console.WriteLine("是否完成:{0}", result.IsCompleted);
            Console.WriteLine("最低迭代:{0}", result.LowestBreakIteration);

出力結果は次のようになります

4. Parallel.Invoke()

Parallel.Invoke() メソッド。タスク並列モードを提供します。 Paraller.Invoke() メソッドでは、実行するメソッドを指定できる Action デリゲート配列を渡すことができます。以下の例を参照してください。出力結果は次のとおりです。

5. 結論

Parallel.For() Paraller.ForEach() メソッドは各反復で同じコードを呼び出しますが、Parallel.Invoke() メソッドは異なるメソッドを同時に呼び出すことができます。 Parallel.ForEach() はデータ並列処理に使用され、Parallel.Invoke() はタスク並列処理に使用されます。

以上がC# 並列タスクの Parallel クラスの紹介例の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。