C# Parallel 循环多线程操作

来源:互联网 发布:数据库的主要特点是 编辑:程序博客网 时间:2024/05/29 19:41
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);        }

这里写图片描述


0 0
原创粉丝点击