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