1.異步方法的實現(xiàn)原理
異步方法不需要多線程,因為一個異步方法并不是運行在一個獨立的線程中的。
異步方法運行在當前同步上下文中,只有激活的時候才占用當前線程的時間。
異步模型采用時間片輪轉來實現(xiàn)。
2.使用異步編程模型的優(yōu)勢:
避免性能瓶頸,提升應用程序的整體響應性。
3.關鍵字
全新的異步編程模型使用“async”和“await”關鍵字來編寫異步方法
async:用來標識一個方法,lambda表達式,或者一個匿名方法是異步的;
await:用來標識一個異步方法應該在此處掛起執(zhí)行,直到等待的任務完成,于此同時,控制權會移交給異步方法的調用方。
4.異步方法的參數(shù)和返回值
異步方法的參數(shù): 不能使用“ref”參數(shù)和“out”參數(shù),但是在異步方法內部可以調用含有這些參數(shù)的方法
異步方法的返回類型:
Task<TResult>:Tresult為異步方法的返回值類型。
Task:異步方法沒有返回值。
void:主要用于事件處理程序(不能被等待,無法捕獲異常)。
5.異步方法的命名規(guī)范
*異步方法的方法名應該以Async作為后綴
*事件處理程序,基類方法和接口方法,可以忽略此命名規(guī)范:
*例如: 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
" 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.異步方法的執(zhí)行序列
1: 進入startButton_Click方法
調用 AccessTheWebAsync.
2: 進入 AccessTheWebAsync
調用HttpClient.GetStringAsync.
3: 回到 AccessTheWebAsync
任務getStringTask開始.
等待getStringTask & 返回一個Task<int>實例給startButton_Click.
4: 回到startButton_Click
任務getLengthTask開始
等待getLengthTask.
5: 回到AccessTheWebAsync
任務getStringTask已經(jīng)完成.
執(zhí)行return語句.
退出AccessTheWebAsync.
6: 回到startButton_Click
任務getLengthTask已經(jīng)完成.
AccessTheWebAsync 的結果被存儲到contentLength.
顯示contentLength 然后退出.