C#4.5的新特性之全新的異步編程模型


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 然后退出.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM