C#5.0特性之 async异步方法

        //1.方法用async关键字修饰
        //2.返回值只能是void,Task,或Task<T>
        //3.方法以Async为后缀
        public static async Task<string> AccessTheWebAsync()
        {
            HttpClient client = new HttpClient();

            //返回一个Task<string>,当使用await关键字来使用getStringTask时,将得到返回的string
            Task<string> getStringTask =  client.GetStringAsync("http://www.cnblogs.com/DebugLZQ/archive/2013/04/06/2993993.html");
            //在GetStringAsync执行期间,可以做其他不依赖GetStringAsync返回值的工作
            DoOthers();
            //await关键字将使AccessTheWebAsync挂起,直到getStringTask任务完成,并将结果返回
            string conent = await getStringTask;
            //任何其他async方法通过关键字await调用AccessTheWebAsync将得到string类型的返回值
            return conent;

            //如果在GetStringAsync执行和等待其完成期间不能进行任何工作,则可以这样简化语句
            //string content = await client.GetStringAsync("...");     
        }

        static void DoOthers()
        {
            for (int i = 0; i < 10; i++)
            {
                Console.WriteLine(i);
            }
        }
          public static async void Get()
        {
            Console.WriteLine(await AccessTheWebAsync());
        }
       static void Main(string[] args)
        {
            Get();
            Console.ReadLine();
        }

一、使一个方法成为异步方法的条件:

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

2、按照约定,异步方法的名称以“Async”后缀为结尾。

3、返回类型为下列类型之一:

如果你的方法有操作数为 TResult 类型的返回语句,则为 Task<TResult>。
如果你的方法没有返回语句或具有没有操作数的返回语句,则为 Task。
如果你编写的是异步事件处理程序,则为 Void。尽量避免void,除非是异步事件处理程序.

方法通常包含至少一个 await 表达式,该表达式标记一个点,在该点上,直到等待的异步操作完成方法才能继续。 同时,将方法挂起,并且将控制权返回到方法的调用方。

二、异步方法中的控制流程:

       <pre style="font-family: Consolas, Courier, monospace !important; padding: 5px; margin: 0px; font-style: normal; font-weight: normal; overflow: auto; word-wrap: normal; color: rgb(0, 0, 0); font-size: 13px; font-variant: normal; letter-spacing: normal; line-height: 17.55px; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; widows: 1; word-spacing: 0px; -webkit-text-stroke-width: 0px;">  <span style="font-family:'Microsoft YaHei UI', 'Microsoft YaHei', SimSun, 'Segoe UI', 'Lucida Grande', Verdana, Arial, Helvetica, sans-serif !important;color:blue;">private</span> <span style="font-family:'Microsoft YaHei UI', 'Microsoft YaHei', SimSun, 'Segoe UI', 'Lucida Grande', Verdana, Arial, Helvetica, sans-serif !important;color:blue;">async</span> <span style="font-family:'Microsoft YaHei UI', 'Microsoft YaHei', SimSun, 'Segoe UI', 'Lucida Grande', Verdana, Arial, Helvetica, sans-serif !important;color:blue;">void</span> startButton_Click(<span style="font-family:'Microsoft YaHei UI', 'Microsoft YaHei', SimSun, 'Segoe UI', 'Lucida Grande', Verdana, Arial, Helvetica, sans-serif !important;color:blue;">object</span> sender, RoutedEventArgs e)
    {
        <span style="font-family:'Microsoft YaHei UI', 'Microsoft YaHei', SimSun, 'Segoe UI', 'Lucida Grande', Verdana, Arial, Helvetica, sans-serif !important;color:green;">// ONE</span>
        Task<<span style="font-family:'Microsoft YaHei UI', 'Microsoft YaHei', SimSun, 'Segoe UI', 'Lucida Grande', Verdana, Arial, Helvetica, sans-serif !important;color:blue;">int</span>> getLengthTask = AccessTheWebAsync();

        <span style="font-family:'Microsoft YaHei UI', 'Microsoft YaHei', SimSun, 'Segoe UI', 'Lucida Grande', Verdana, Arial, Helvetica, sans-serif !important;color:green;">// FOUR</span>
        <span style="font-family:'Microsoft YaHei UI', 'Microsoft YaHei', SimSun, 'Segoe UI', 'Lucida Grande', Verdana, Arial, Helvetica, sans-serif !important;color:blue;">int</span> contentLength = <span style="font-family:'Microsoft YaHei UI', 'Microsoft YaHei', SimSun, 'Segoe UI', 'Lucida Grande', Verdana, Arial, Helvetica, sans-serif !important;color:blue;">await</span> getLengthTask;

        <span style="font-family:'Microsoft YaHei UI', 'Microsoft YaHei', SimSun, 'Segoe UI', 'Lucida Grande', Verdana, Arial, Helvetica, sans-serif !important;color:green;">// SIX</span>
        resultsTextBox.Text +=
            String.Format(<span style="font-family:'Microsoft YaHei UI', 'Microsoft YaHei', SimSun, 'Segoe UI', 'Lucida Grande', Verdana, Arial, Helvetica, sans-serif !important;color:#a31515;">"\r\nLength of the downloaded string: {0}.\r\n"</span>, contentLength);
    }
} 跟踪异步程序

 

1.事件处理程序调用并等待 AccessTheWebAsync 异步方法。
2.AccessTheWebAsync 可创建 HttpClient 实例并调用 GetStringAsync 异步方法以下载网站内容作为字符串。
3.GetStringAsync 中发生了某种情况,该情况挂起了它的进程。 可能必须等待网站下载或一些其他阻止活动。 为避免阻止资源,GetStringAsync 会将控制权出让给其调用方 AccessTheWebAsync。
GetStringAsync 返回 Task<TResult>,其中 TResult 为字符串,并且 AccessTheWebAsync 将任务分配给 getStringTask 变量。 该任务表示调用 GetStringAsync 的正在进行的进程,其中承诺当工作完成时产生实际字符串值。
4.由于尚未等待 getStringTask,因此,AccessTheWebAsync 可以继续执行不依赖于 GetStringAsync 得出的最终结果的其他工作。 该任务由对同步方法 DoIndependentWork 的调用表示。
5.DoIndependentWork 是完成其工作并返回其调用方的同步方法。
6.AccessTheWebAsync 已用完工作,可以不受 getStringTask 的结果影响。 接下来,AccessTheWebAsync 需要计算并返回该下载字符串的长度,但该方法仅在具有字符串时才能计算该值。
因此,AccessTheWebAsync 使用一个 await 运算符来挂起其进度,并把控制权交给调用 AccessTheWebAsync 的方法,即异步事件StartButton_click。 AccessTheWebAsync 将 Task(Of Integer) 或 Task<int> 返回至调用方。 该任务表示对产生下载字符串长度的整数结果的一个承诺。在调用方内部(此示例中的事件处理程序),处理模式将继续。在等待结果前,调用方可以开展不依赖于 AccessTheWebAsync 结果的其他工作,否则就需等待片刻。 事件处理程序等待 AccessTheWebAsync,而 AccessTheWebAsync 等待 GetStringAsync。

7.GetStringAsync 完成并生成一个字符串结果。 字符串结果不是通过按你预期的方式调用 GetStringAsync 所返回的。 (记住,该方法已返回步骤 3 中的一个任务)。 相反,字符串结果存储在表示完成 getStringTask 方法的任务中。 await 运算符从 getStringTask 中检索结果。 赋值语句将检索到的结果赋给 urlContents。
8.当 AccessTheWebAsync 具有字符串结果时,该方法可以计算字符串长度。 然后,AccessTheWebAsync 工作也将完成,并且等待事件处理程序可继续使用。 在此主题结尾处的完整示例中,可确认事件处理程序检索并打印长度结果的值。


实例:https://msdn.microsoft.com/zh-cn/library/hh300224.aspx

https://msdn.microsoft.com/zh-cn/library/hh191443.aspx


使用异步进行文件访问:https://msdn.microsoft.com/zh-cn/library/jj155757.aspx

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值