并行处理是多线程的一种,而多线程是并发的一种。异步编程也是并发的一种形式,它采用future模式或回调机制,以避免产生不必要的线程。一个future(或promise)类型代表即将完成的操作。在.NET中,新版future类型有Task和Task<TResult>.
关键字 await 不仅能用于任务,还能用于所有遵循特定模式的 awaitable 类型
如果程序中有大量的计算任务,并且这些任务能分割成几个互相独立的任务块,那就应该使用并行编程。并行的形式有两种:数据并行(data parallelism)和任务并行(task parallelim).
PLINQ(Parallel LINQ), 它为 LINQ 查询提供了 AsParallel 扩展。跟PLINQ 相比,Parallel 对资源更加友好,Parallel 与系统中的其他进程配合得比较好 , 而PLINQ 会试图让所有的 CPU 来执行本进程。Parallel 的缺点是它太明显。很多情况下,PLINQ 的代码更加优美.
使用`Task.FromResult`实现一个具有异步签名的同步方法
1 interface IMyAsyncInterface 2 { 3 Task<int> GetValueAsync(); 4 } 5 class MySynchronousImplementation : IMyAsyncInterface 6 { 7 public Task<int> GetValueAsync() 8 { 9 //创建并返回一个新的Task<T>对象,这个Task对象是已经完成的,并有指定的值 10 return Task.FromResult(13); 11 } 12 }
在默认情况下,一个 async 方法在被 await 调用后恢复运行时,会在原来的上下文中运行。
在async Task方法中引发的异常,存放在返回的Task对象中,只有当Task对象被await调用时,才会引发异常。因为 async void 方法没有返回 Task 对象,无法存放异常,所以做法就会不同,最好不要从 async void 方法传递出异常。如果必须使用 async void 方法,可考虑把所有代码放在 try 块中,直接处理异常。