Hello C#5.0新特性

  C#5.0最大的新特性,莫过于Async和Parallel。

  以往我们为了让用户界面保持相应,我们可以直接使用异步委托或是System.Threading命名空间中的成员,但System.Threading.Tasks命名空间提供了一种更加简洁的方法---使用Task类。Task类可以轻松地在次线程中调用方法,可以作为异步委托的简单替代品。

  关于Async,可以参考MSDN的Task 类以及使用 Async 和 Await 的异步编程(C# 和 Visual Basic),其介绍了其中的方法、属性等,讲的都比LZ要好。

  下面我们实现一个异步调用的例子,看看用法有什么不同。

  我想要的是:异步执行方法,在方法执行后紧接着异步执行另一个方法,该方法以前面的方法结果为参数

using System;
using System.Threading.Tasks;
//异步执行方法,在方法执行后紧接着异步执行另一个方法,该方法以前面的方法结果为参数
namespace AsyncTask
{
    class result
    {
        public int number { set; get; }
    }
    class Program
    {
        static void Main(string[] args)
        {
            var result = new result { number = 4 };
            var t1 = new Task(First, result);//Action
            var t2 = t1.ContinueWith<int>(First1);//Func
            var t3 = t1.ContinueWith<int>(First2);
            t1.Start();
            Console.WriteLine(t2.Result);//t.Result
            Console.WriteLine(t3.Result);
            Console.ReadKey();
        }

        static void First(object o)
        {
            result x = (result)o;
            x.number *= 2;
        }

        static int First1(Task o)
        {
            result x = (result)o.AsyncState;//
            return x.number * x.number;
        }

        static int First2(Task o)
        {
            result x = (result)o.AsyncState;
            return x.number * x.number * x.number;
        }

    }
}

  可以对比DebugLZQ的.NET异步编程总结----四种实现模式,看看同样为异步,实现方法有什么不同。
  关于Parallel,现在双核(多核)的计算机已经很普片,计算机有多个CPU,就能够以并行的方式执行线程,这将大大改善应用程序的运行时性能。

  总体而言,System.Threading.Tasks中的类型(以及System.Threading中的一些相关类型)被称为任务并行库(Task Parallel Library,TPL)。TPL使用CLR线程池自动将应用程序的工作动态分配到可用的CPU中。TPL还处理工作分区、线程调度、状态管理和其他低级别的细节操作。TPL中最重要的类是System.Threading.Tasks.Parallel,它提供大量的方法,能够以并行的方式迭代数据集合(实现了IEnumberable<T>的对象)。该类支持两个主要的静态方法---Parallel.For()和Parallel.ForEach()  (Parallel.Invoke())每个方法都有很多的重载版本。

  MSDN Parallel 类.NET Framework 中的并行编程 可以参考,以For为例

using System.Threading.Tasks;

namespace ParallelFor
{
    class Test
    {
        static int N = 1000;

        static void TestMethod()
        {
            // Using a named method.
            Parallel.For(0, N, Method2);

            // Using an anonymous method.
            Parallel.For(0, N, delegate(int i)
            {
                // Do Work.
            });

            // Using a lambda expression.
            Parallel.For(0, N, i =>
            {
                // Do Work.
            });
        }

        static void Method2(int i)
        {
            // Do work.
        }
    }
}

ForEach、Invoke类似

            Parallel.ForEach(new[] {1, 2, 3, 4, 5},
                             i =>
                             Console.WriteLine("{0}, Task: {1}, Thread {2}", i, Task.CurrentId,
                                               Thread.CurrentThread.ManagedThreadId));
                Parallel.Invoke(
                    BasicAction,    // Param #0 - static method
                    () =>            // Param #1 - lambda expression
                    {
                        Console.WriteLine("Method=beta, Thread={0}", Thread.CurrentThread.ManagedThreadId);
                    },
                    delegate()        // Param #2 - in-line delegate
                    {
                        Console.WriteLine("Method=gamma, Thread={0}", Thread.CurrentThread.ManagedThreadId);
                    }
                );

最后:关于Parallel和Async不是LZ一篇博文就能解释的清楚,LZ没有实际的用过,不敢说咋滴咋滴...博文是个人的理解,难免出现纰漏,欢迎批评指正!关于学习方面,中文的书籍普遍比较滞后,针对个人的需求并非所有的英文书籍都有翻译版,加之翻译者个人理解及翻译风格的原因,最终...

关于新书,公司给买了本:

书比较厚,1k来页,英文的书籍看起来比较慢,但是看起来很舒服。

posted @ 2013-04-06 11:17  DebugLZQ  阅读(3432)  评论(2编辑  收藏  举报