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来页,英文的书籍看起来比较慢,但是看起来很舒服。