.Net 4.0并行库实用性演练

  自VS2010发布近半年了,虽然整天想学习新东西,要更新到自己时,发现原来自己基本也很懒,2008还没用上多久呢,无奈被2010了。用了几天,IDE模样还是和05、08差不多,加了些小特性,以后慢慢体验吧,第一感觉启动速度慢多了。主要还是.NET 4.0的变化,其实也就是修修补补,语言特性几乎没什么新特性,C#多了个Dynamic,十年前VB就支持的晚绑定。只好把注意力放在了Framework上,新加的并行支持应该是最大的变化吧。

  VS2010发布会我也去过的,并行支持是一大卖点。当时记得台上一个MM对一个Linq查询语句加了个ASParallel(),性能就神奇地提高了一倍,台下掌声雷动。确实不费吹灰之力提高程序性能,是最能引起大家兴趣的。在看电子期刊时,看到冷冷同学,还有吴秦的文章,给偶这些菜鸟以震撼的启发,原来偶已经远远落在了在读大学生的后面。

  那就开始学吧,就拿Parallel开刀。先抓个垫背的:

static void Set(int length)        {            var array = new int[length, length, length];            for (int i = 0; i < length; i++)                for (int j = 0; j < length; j++)                    for (int k = 0; k < length; k++)                        array[i, j, k] = System.Threading.Thread.CurrentThread.ManagedThreadId;        }

前面说在练习Parallel时,发现另有乾坤,是这样的代码:

static IEnumerable<Person> testFill(){    var list = new List<Person>(9);    Enumerable.Range(1, 99999).ToList().ForEach(n =>    {        var name = "Person" + n % 9;        list.Add(new Person { Id = n, Name = name });    });    Console.WriteLine("Person's count is {0}", list.Count);    return list;}static IEnumerable<Person> testFillParallel(){    var list = new List<Person>(9);    Enumerable.Range(1, 99999).ASParallel().ForAll(n =>    {        var name = "Person" + n % 9;        list.Add(new Person { Id = n, Name = name });    });    Console.WriteLine("Person's count is {0}", list.Count);    return list;}class Person{    internal int Id { get; set; }    internal string Name { get; set; }}

 

  接着上一次说,即使用了新的线程安全的集合BlockingCollection,这段代码还是会有问题。

static void testFillParallel(){    var list = new BlockingCollection<Person>(9999);    Enumerable.Range(1, 99999).ASParallel().ForAll(n =>    {        var name = "Person " + n % 9;        if (list.Count(p => p.Name == name) < 1) list.Add(new Person { Id = n, Name = name });    });    Console.WriteLine("Person's count is {0}", list.Count);}

NET技术.Net 4.0并行库实用性演练,转载需保留来源!

郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。