• C#5.0的新特性之全新的异步编程模型


    1.异步方法的实现原理

    异步方法不需要多线程,因为一个异步方法并不是运行在一个独立的线程中的。
    异步方法运行在当前同步上下文中,只有激活的时候才占用当前线程的时间。
    异步模型采用时间片轮转来实现。

    2.使用异步编程模型的优势:

    避免性能瓶颈,提升应用程序的整体响应性。

    3.关键字

       全新的异步编程模型使用“async”和“await”关键字来编写异步方法
    async:用来标识一个方法,lambda表达式,或者一个匿名方法是异步的;
    await:用来标识一个异步方法应该在此处挂起执行,直到等待的任务完成,于此同时,控制权会移交给异步方法的调用方。

    4.异步方法的参数和返回值

    异步方法的参数: 不能使用“ref”参数和“out”参数,但是在异步方法内部可以调用含有这些参数的方法
    异步方法的返回类型:

      Task<TResult>:Tresult为异步方法的返回值类型。

      Task:异步方法没有返回值。

      void:主要用于事件处理程序(不能被等待,无法捕获异常)。

    5.异步方法的命名规范

    *异步方法的方法名应该以Async作为后缀
    *事件处理程序,基类方法和接口方法,可以忽略此命名规范:
    *例如: startButton_Click不应重命名为startButton_ClickAsync
     

    6.一个Demo

    复制代码
     1 <Window
     2         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
     3         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
     4         xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d" x:Class="AsyncSample.MainWindow"
     5         Title="Control Flow Trace" Height="350" Width="592">
     6     <Grid>
     7         <Button x:Name="startButton" Content="Start&#xa;" HorizontalAlignment="Left" Margin="250,10,0,0" VerticalAlignment="Top" Width="75" Height="24"  Click="startButton_Click" d:LayoutOverrides="GridBox"/>
     8         <TextBox x:Name="resultsTextBox" HorizontalAlignment="Left" TextWrapping="Wrap" VerticalAlignment="Bottom" Width="576" Height="265" FontFamily="Lucida Console" FontSize="10" VerticalScrollBarVisibility="Visible" Grid.ColumnSpan="3"/>
     9     </Grid>
    10 </Window>
    复制代码
    复制代码
     1 using System;
     2 using System.Collections.Generic;
     3 using System.Linq;
     4 using System.Text;
     5 using System.Threading.Tasks;
     6 using System.Windows;
     7 using System.Windows.Controls;
     8 using System.Windows.Data;
     9 using System.Windows.Documents;
    10 using System.Windows.Input;
    11 using System.Windows.Media;
    12 using System.Windows.Media.Imaging;
    13 using System.Windows.Navigation;
    14 using System.Windows.Shapes;
    15 using System.Net.Http;
    16 
    17 namespace AsyncSample
    18 {
    19     /// <summary>
    20     /// MainWindow.xaml 的交互逻辑
    21     /// </summary>
    22     public partial class MainWindow : Window
    23     {
    24         public MainWindow()
    25         {
    26             InitializeComponent();
    27             
    28         }
    29         private async void startButton_Click(object sender, RoutedEventArgs e)
    30         {
    31             // 1
    32             Task<string> getLengthTask = AccessTheWebAsync();
    33 
    34             // 4
    35             string contentLength = await getLengthTask;
    36 
    37             // 6
    38             resultsTextBox.Text +=
    39                 String.Format("\r\nLength of the downloaded string: {0}.\r\n", contentLength);
    40         }
    41 
    42 
    43         async Task<string> AccessTheWebAsync()
    44         {
    45             // 2
    46             HttpClient client = new HttpClient();
    47             Task<string> getStringTask =
    48                 client.GetStringAsync(http://www.cnblogs.com);
    49 
    50             // 3                
    51             string urlContents = await getStringTask;
    52 
    53             // 5
    54             return urlContents;
    55         }
    56     }
    57 }
    复制代码

    7.异步方法的执行序列

    1:  进入startButton_Click方法

               调用 AccessTheWebAsync.

    2:   进入 AccessTheWebAsync

               调用HttpClient.GetStringAsync.
     

    3:  回到 AccessTheWebAsync

               任务getStringTask开始.
               等待getStringTask & 返回一个Task<int>实例给startButton_Click.

    4:  回到startButton_Click

               任务getLengthTask开始
               等待getLengthTask.

    5:  回到AccessTheWebAsync

               任务getStringTask已经完成.
               执行return语句.
               退出AccessTheWebAsync.

    6:   回到startButton_Click

               任务getLengthTask已经完成.
               AccessTheWebAsync 的结果被存储到contentLength.
               显示contentLength 然后退出.
     
    分类: c#
    标签: C#vs2012
  • 相关阅读:
    判断DataSet为空
    msxml3.dll 错误 '800c0008'
    google Map api地理位置坐标转换
    C# .net中cookie值为中文时的乱码解决方法
    windows pear 安装
    smarty2 设置、变量、函数
    简单模板类
    mysql 1366 插入错误
    Oracle修改账户口令
    C# Winform验证码
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/2680701.html
Copyright © 2020-2023  润新知