C#5.0之后推荐使用TPL,Task Parallel Libray 任务并行库 和PLINQ

学习书籍: <C#本质论>

1--C#5.0之后推荐使用TPL(Task Parallel Libray 任务并行库) 和PLINQ(Parallel LINQ, 并行Linq).

其次是TAP(Task-based Asynchronous Pattern, 基于任务的异步模式).

--用AggregateException处理Task上的未处理异常.

--取消任务. CancellationToken

--async修饰方法, 返回Task. task.wait(100)可以阻塞现场. async方法内await 启线程执行.

==> 第一部分, 5.0推荐的线程使用方式.

2--学习了Task 等线程同步使用方式:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace Task1
{
    class Program
    {
        const int _Total = 99999;
        static long _Count = 0;
        readonly static object _Sync = new Object();
        static void Main(string[] args)
        {
            //Task task = Task.Run(()=>Decrement());
            //for (int i = 0; i < _Total; i++)
            //{
            //    _Count++;
            //}
            //task.Wait();
            //Console.WriteLine("Count = {0}", _Count);
            //CountAsync();
            //int x = 0;
            //Parallel.For(0, 999999, i =>
            //    {
            //        x++;
            //        x--;
            //    });
            //Console.WriteLine("Count = {0}",x);
            Task task = Task.Run(() => Decrement());
            for (int i = 0; i < _Total; i++)
            {
                bool lockTaken = false;
                try
                {
                    Monitor.Enter(_Sync, ref lockTaken);
                    _Count++;
                }
                finally
                {
                    if (lockTaken)
                    {
                        Monitor.Enter(_Sync);
                    }
                }
            }
            task.Wait();
            Console.WriteLine("Count = {0}", _Count);
            Console.ReadKey();           
        }
        public static async void CountAsync()
        {
            Task task = Task.Run(() => Decrement());
            for (int i = 0; i < _Total; i++)
            {
                _Count++;
            }
            await task;
            Console.WriteLine("Count = {0}", _Count);
        }
        static void Decrement()
        {
            for (int i = 0; i < _Total; i++)
            {
                bool lockTaken = false;
                try
                {
                    Monitor.Enter(_Sync, ref lockTaken);
                    _Count--;
                }
                finally
                {
                    if (lockTaken)
                    {
                        Monitor.Exit(_Sync);
                    }
                }
            }
        }
    }
}

==> 第二部分.
TPL和C#5.0之前的多线程模式

2-- 复杂带状态的操作
1--CPS 连续调用样式. 的fire-and-forget模式. 减少了直接再beginXXX方法后调用EndXXX方法.
通过CPS,"登记"异步方法结束时执行的代码.
3-- 在APM方法间传递状态
1--可以通过Lambda完成委托BeginXXX调用.
1. 调用APM
            #region
            String url = "www.baidu.com";
            if (args.Length > 0)
            {
                url = args[0]; 
            }
            Console.WriteLine(url);
            WebRequest webRequest = WebRequest.Create(url);
            IAsyncResult asyncResult = webRequest.BeginGetResponse(null, null);
            while(!asyncResult.AsyncWaitHandle.WaitOne(100))
            {
                Console.Write(".");
            }
            WebResponse response = webRequest.EndGetResponse(asyncResult);
            using (StreamReader reader = new StreamReader(response.GetResponseStream()))
            {
                int length = reader.ReadToEnd().Length;
                Console.WriteLine(length);
            }