using System;
using System.Drawing;
using OpenTK;
using OpenTK.Graphics;
using OpenTK.Graphics.OpenGL;
using OpenTK.Input;
using System.Runtime.InteropServices;
using System.Threading;
using System.Threading.Tasks;
using System.Linq;
namespace Example
{
class MyApplication
{
public static void Main()
{
Parallel.For(0, 500000000000000, i =>
{
Console.WriteLine(i);
});
}
}
}
这样的for循环就是使用了多线程,和c++里的OpenMP类似。
运行图:
然后是运行时的cpu占用率:
下图是正常的使用for循环输出时的cpu占用率:
可见,对cpu的使用效率提升了很多。
也可以使用ParallelLoopState.Break来进行控制
如下:
using System;
using System.Drawing;
using OpenTK;
using OpenTK.Graphics;
using OpenTK.Graphics.OpenGL;
using OpenTK.Input;
using System.Runtime.InteropServices;
using System.Threading;
using System.Threading.Tasks;
using System.Linq;
namespace Example
{
class MyApplication
{
public static void Main()
{
Parallel.For(0, 500000000000000,(i,loopstate) =>
{
Console.WriteLine(i);
if (i == 100) //当i==100时跳出
loopstate.Break();
});
}
}
}
PLINQ
使用起来很简单,就是在集合后加个AsParallel()。
public static void Main()
{
var numbers = Enumerable.Range(0, 100);
var result = numbers.AsParallel().AsOrdered().Where(i => i % 2 == 0);
foreach (var i in result)
Console.WriteLine(i);
}
但这样得到的第二个数组并不是按顺序排的:
想得到按顺序的可以在后面再加个AsOrdered():
public static void Main()
{
var numbers = Enumerable.Range(0, 100);
var result = numbers.AsParallel().AsOrdered().Where(i => i % 2 == 0);
foreach (var i in result)
Console.WriteLine(i);
}