天天看点

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

继续阅读