Framework 4.0之线程新特性

1.博客园文章:线程阶段性总结——APM,ThreadPool,Task,TaskScheduler ,CancellationTokenSource

http://www.cnblogs.com/xiashengwang/archive/2012/08/18/2645588.html

2.博客园文章:C# 线程知识--使用Task执行异步操作

http://www.cnblogs.com/pengstone/archive/2012/12/23/2830238.html

3.博客园文章: Metro Style App 异步-简洁而不简单的异步

http://www.cnblogs.com/trigged/archive/2012/03/09/2388182.html

4.博客园文章:异步编程中的最佳做法

http://www.cnblogs.com/LittleFeiHu/p/4604179.html

5.博客园文章:async And await异步编程活用基础

http://www.cnblogs.com/x-xk/archive/2013/06/05/3118005.html

注意事项:

1. 有async 则必须有await ,异步方法的返回类型必须是Task<T>

2. 被async 标记的方法一定是异步方法,异步方法的返回值必须为void、Task、Task<T>

3. 没被async标记修饰,但返回值为Task、Task<T>的方法也是异步方法

4. await 关键字后的方法一定是异步方法

5. 方法中如果使用了await关键字,那么该方法也应该被async关键字修饰

6. 使用await(await  GetResult(100))关键字,会使程序等待返回结果后再继续向下执行代码,但不会阻塞UI线程 

参考代码:

static CancellationTokenSource cancellation = new CancellationTokenSource(3000);

        private static void CanceltionDemo()
        {

            Task<int> task = new Task<int>(() => { return GetNumber(500); }, cancellation.Token);


            task.ContinueWith(t => {
                if (t.IsFaulted == false && t.IsCanceled == false)
                {
                    int data = t.Result;
                    Console.WriteLine(data);
                }
                else
                {
                    Console.WriteLine("error");
                }
            });

            cancellation.Token.Register(() => { Console.WriteLine("task is be canceled..."); });


            task.Start();

        }

        private static int GetNumber(int number)
        {
            if (cancellation.IsCancellationRequested)
            {
                cancellation.Token.ThrowIfCancellationRequested();
            }
            if (number == 1 || number == 2)
            {
                return 1;
            }
            return GetNumber(number - 2) + GetNumber(number - 1);
        }


        private static void ContinueWithDemo()
        {
            var result = DoWorkAsync().ContinueWith(task => {


                Console.WriteLine(task.Result);

            }, TaskContinuationOptions.None);
        }

        private static void ResultPropertyDemo()
        {
            var result = DoWorkAsync().Result;
            Console.WriteLine(result);
        }

        static Task<string> DoWorkAsync()
        {
            return Task<string>.Factory.StartNew(() =>
            {
                throw new Exception("error");
                Thread.Sleep(3000);
                return "Hello world...";
            });
        }

优秀的教材:

1. Pro ASP.NET WEB API

猜你喜欢

转载自code.iteye.com/blog/2225276