.net 4.5 异步编程

1,异步操作能避免阻塞UI线程,提高用户响应。背后技术手段是由编译器自动使用后台线程池。

2,异步方法用async关键字修饰,返回类型用Task或Task<T>,T表示return语句返回的的数据类型。

/// <summary>
        /// 异步访问 Web 
        /// </summary>
        /// <returns></returns>
        /// <remarks>
        /// 方法签名的 3 要素:
        ///     ① async 修饰符
        ///     ② 返回类型 Task 或 Task<TResult>:这里的 Task<int> 表示 return 语句返回 int 类型
        ///     ③ 方法名以 Async 结尾
        /// </remarks>
        async Task<int> AccessTheWebAsync()
        {
            //记得 using System.Net.Http 哦
            var client = new HttpClient();

            //执行异步方法 GetStringAsync
            Task<string> getStringTask = client.GetStringAsync("http://www.google.com.hk/");

            //假设在这里执行一些非异步的操作
            Do();

            //等待操作挂起方法 AccessTheWebAsync
            //直到 getStringTask 完成,AccessTheWebAsync 方法才会继续执行
            //同时,控制将返回到 AccessTheWebAsync 方法的调用方
            //直到 getStringTask 完成后,将在这里恢复控制。
            //然后从 getStringTask 拿到字符串结果
            string urlContents = await getStringTask;

            //返回字符串的长度(int 类型)
            return urlContents.Length;
        }

如果 AccessTheWebAsync 在调用 GetStringAsync() 时没有其它操作(如:代码中的 Do()),你可以用这样的方式来简化代码。

string urlContents = await client.GetStringAsync("http://www.google.com.hk/");

3, 简单总结:

  (1)方法签名包含一个 async 修饰符。

  (2)根据约定,异步方法的名称需要以“Async”后缀为结尾。

  (3)3 种返回类型:

    ① Task<TResult>:返回 TResult 类型。

    ② Task:没有返回值,即返回值为 void。

    ③ void:只适用于异步事件处理程序。

  (4)方法通常包含至少一个 await 表达式,该表达式标记一个点,我们可以成为悬挂点,在该点上,直到等待的异步操作完成,之后的方法才能继续执行。 与此同时,该方法将挂起,并将控制权返回到方法的调用方。  

  需要使用异步方法的话,我们直接在系统内部使用所提供的关键字 async 和 await 就可以了,剩余的其它事情,就留给编译器吧。

4,返回类型:

static async Task<Guid> Method1Async()  //Task<Guid>
        {
            var result = Guid.NewGuid();

            await Task.Delay(1);

            //这里返回一个 Guid 的类型
            return result;
        }

        static async Task Method2Async()  //Task
        {
            //Do...

            await Task.Delay(1);

            //Do...

            //这里没有 return 语句
        }
//调用 Method1Async
            //方式一
            Task<Guid> t1 = Method1Async();
            Guid guid1 = t1.Result;

            //方式二
            Guid guid2 = await Method1Async();

            //调用 Method2Async
            //方式一
            Task t2 = Method2Async();
            await t2;

            //方式二
            await Method2Async();

猜你喜欢

转载自www.cnblogs.com/TianPing/p/9786180.html
4.5