当前位置:首页 > Windows程序 > 正文

C#高级编程六十三天

2021-03-28 Windows程序

.NET4System.Linq命名空间中包含一个新类ParallelEnumerable,可以分解查询的工作使其分布在多个线程上.尽管Enumerable类给IEnumerable<T>接口定义了扩展方法,ParallelEnumerable类的大多数扩展方法是ParallelQuery<TSource>类的扩展.一个重要的例外是AsParallel()方法,它扩展了IEnumerable<TSource>接口,返回ParallelQuery<TSource>,所以正常的集合类可以以平行方式查询.

LINQ比较强大的是还提供了可并行处理的查询,这使得我们可以借助它来完成一些查询处理或处理并行操作.

先来说一下并行集合,并行计算使用的多个线程同时进行计算,所以要控制每个线程对资源的访问,我们先来看一下常用的List<T>集合,在并行计算下的表示:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

namespace 并行集合和LINQ

{

class Program

{

static void Main(string[] args)

{

List<int> list = new List<int>();

Parallel.For(0, 10000, item =>

{

list.Add(item);

}

);

Console.WriteLine("list的长度为 : {0}",list.Count());

//多测试几次,就是说多运行几次

/*

从结构可以看出,我们的结构不是10000.这是为什么呢,这是因为List是费线程安全的

* ,也就是说,任何线程都可以修改他的值

*/

Console.ReadKey();

}

}

}

接下来我们看一下并行集合----线程安全集合,System.Collections.Concurrent命名空间中,首先看一下ConcurrentBag<T>泛型集合,其用法和List<T>类似:

ConcurrentBag<int> list =new ConcurrentBag<int>();

Parallel.For(0, 10000, item =>

{

list.Add(item);

}

);

Console.WriteLine("ConcurrentBag的长度为 : {0}", list.Count());

//不管运行几次,结果都是10000

分析一下,因为ConcurrentBag是线程安全的,所以每次结果都是正确的.

下面我们来修改代码看看ConcurrentBag里面的数据到底是怎样存放的,修改代码如下:

using System;

using System.Collections.Concurrent;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

namespace 并行集合和LINQ

{

class Program

{

static void Main(string[] args)

{

ConcurrentBag<int> list =new ConcurrentBag<int>();

Parallel.For(0, 10000, item =>

{

list.Add(item);

}

);

Console.WriteLine("ConcurrentBag的长度为 : {0}", list.Count());

//不管运行几次,结果都是10000

int n = 0;

foreach (var item in list)

{

if (n>10)

{

break;

}

n++;

Console.WriteLine("Item[{0}] = {1}",n,item);//,多运行几次,观察这里的输出

}

Console.WriteLine("ConcurrentBag的最大长度为 : {0}",list.Max());

Console.ReadKey();

}

}

}

分析:可以看到ConcurrentBag中的数据并不是按照顺序排列的,顺序是乱的,随机的.我们平时使用的Max,First,LastLINQ方法都还有.其十分类似Enumerable的用法.

温馨提示: 本文由Jm博客推荐,转载请保留链接: https://www.jmwww.net/file/68934.html