天天看點

Parallel.Invoke

 Parallel.Invoke能并發運作多個方法。

簽名如下:

public static void Invoke(

params Action[] actions

)

是一個靜态方法,無需執行個體化。參數是一個Action委托數組,可以填寫任意多個方法,然後等他們運作完畢。方法無序執行。有4個邏輯核心也不是保證4個方法同時進行。

 class Program

    {

        static void Main(string[] args)

        {

            var sw = Stopwatch.StartNew();

            //sequential

            Console.WriteLine("sequential");

            Sum1();

            Sum2();

            Console.WriteLine(sw.Elapsed.ToString());

            //parallel

            sw = Stopwatch.StartNew();

            Console.WriteLine("parallel");

            Parallel.Invoke(Sum1, Sum2);

          }

        static void Sum1()

            long sum = 0;

            for (int i = 0; i < 10000000; i++)

            {

                sum += i;

            }

            Console.WriteLine(sum.ToString());

        }

        static void Sum2()

                sum -= i;

     }

sequential

49999995000000

-49999995000000

00:00:00.0861083

parallel

00:00:00.0458769

Press any key to continue . . .

從上斷程式看出,并行運作節省了約一半的CPU時間

但是當兩個函數都耗時不多的情況下,并行運作反而慢了。看下面的代碼

static void Main(string[] args)

{

var sw = Stopwatch.StartNew();

//sequential

Console.WriteLine("sequential");

Sum1();

Sum2();

Console.WriteLine(sw.Elapsed.ToString());

//parallel

sw = Stopwatch.StartNew();

Console.WriteLine("parallel");

Parallel.Invoke(Sum1, Sum2);

}

static void Sum1()

long sum = 0;

for (int i = 0; i < 100; i++)

sum += i;

Console.WriteLine(sum.ToString());

static void Sum2()

sum -= i;

4950

-4950

00:00:00.0013660

00:00:00.0015971

繼續閱讀