.net4.5使用async和await異步編程實例
關(guān)于異步編程的簡單理解:
在.NET4.5中新增了異步編程的新特性async和await,使得異步編程更為簡單。通過特性可以將這項復(fù)雜的工作交給編譯器來完成了。之前傳統(tǒng)的方式來實現(xiàn)異步編程較為復(fù)雜,這樣對于程序猿來說處理起來比較困難,調(diào)試也沒那么方便,后續(xù)的維護工作也比較痛苦。
Async和Await關(guān)鍵字是C#異步編程的核心。通過使用這兩個關(guān)鍵字,你可以使用.NET Framework 或 Windows Runtime的資源創(chuàng)建一個異步方法如同創(chuàng)建一個同步方法一樣容易。
接下來通過VS2013 創(chuàng)建一個基于.NET4.5的控制臺應(yīng)用程序進行嘗試。
先直接把簡單的代碼貼出來,如下所示
/// <summary>
/// 同步方法打印Hello World
/// </summary>
public static void PrintHelloWorld()
{
Console.WriteLine("同步方法調(diào)用開始");
Console.WriteLine("同步方法:Hello World");
Thread.Sleep(1000);
Console.WriteLine("退出同步方法");
}
/// <summary>
/// 異步方法打印Hello World
/// </summary>
public async static void AsyncPrintHelloWorld()
{
Console.WriteLine("異步方法調(diào)用開始");
Console.WriteLine("異步方法:Hello World");
await Task.Delay(1000);
Console.WriteLine("退出異步方法");
}
上面注釋中也有進行說明,第一個是同步方法,第二個是異步方法。同步方法可以通過Thread.Sleep(1000);暫停方法執(zhí)行1000ms,同樣的異步方法可以通過await Task.Delay(1000)來處理,而且在異步方法的聲明中要加入async的關(guān)鍵字。
接下來是簡單的調(diào)用
static void Main(string[] args)
{
Console.WriteLine("======同步方法調(diào)用=====");
PrintHelloWorld();
Console.WriteLine("同步方法調(diào)用結(jié)束");
Console.WriteLine("======異步方法調(diào)用=====");
AsyncPrintHelloWorld();
Console.WriteLine("異步方法調(diào)用結(jié)束");
Console.ReadLine();
}
F5執(zhí)行后結(jié)果如下
通過執(zhí)行結(jié)果可以很明顯的看出,調(diào)用的同步方法里面是順序執(zhí)行的,而在異步方法中不一樣,當(dāng)通過Task.Delay(1000)暫停當(dāng)前方法的時候,其方法外面的下面的方法會繼續(xù)執(zhí)行,也就是打印“異步方法調(diào)用結(jié)束”的語句。
可以發(fā)現(xiàn)使用了關(guān)鍵字之后,同步與異步的語法差別很小。隨著.NET4.5的推出,許多類庫和已有類庫都將支持這種新型的異步語法,比如我正在學(xué)習(xí)的HTTPClient等等。
上面的演示只是通過簡單的void的方法進行演示的,當(dāng)然肯定可以帶上返回值的額。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace Async
{
class Program
{
static void Main(string[] args)
{
var ret = AsyncAdd("累死了,真想不出啥好的例子來調(diào)用");
Console.WriteLine(ret.Result);
Console.ReadLine();
}
///異步打印傳入的字符串
public async static Task<string> AsyncAdd(string str)
{
string result = await PringString(str);
return result;
}
public async static Task<string> PringString(string str)
{
return "Hello World" + str;
}
}
}
通過運行其實和同步的是一樣的,只不過看看如何來定義異步方法的返回值,根據(jù)Task<T>來進行定義。
如果指定Task<TResult>為返回結(jié)果,那么這個方法必須包含return指定的TResult結(jié)果的語句。
一個async方法里通常包含一個或多個的對應(yīng)的await操作符,但如果沒有await表達式也不會導(dǎo)致編譯錯誤。但如果調(diào)用一個async方 法,卻不使用await關(guān)鍵字來標(biāo)記一個掛起點的話,程序?qū)雎詀sync關(guān)鍵字并以同步的方式執(zhí)行
總結(jié)
1.一個異步方法的聲明中必然包含一個async的修飾符。
2.異步方法的方法名可以以“Async”結(jié)尾。
3.Task<TResult> 當(dāng)你的方法有返回值時,那么TResult即返回值的類型
4.方法通常至少包含一個await表達式。
相關(guān)文章
一看就懂:圖解C#中的值類型、引用類型、棧、堆、ref、out
這篇文章主要介紹了一看就懂:圖解C#中的值類型、引用類型、棧、堆、ref、out,本文用淺顯易懂的語言組織介紹了這些容易混淆的概念,需要的朋友可以參考下2015-06-06C# RGB圖像和灰度圖像互轉(zhuǎn)的實現(xiàn)
在我們的圖像類型教程中定義了RGB顏色模型和灰度格式,本文主要介紹了C# RGB圖像和灰度圖像互轉(zhuǎn)的實現(xiàn),文中通過代碼介紹的非常清楚,具有一定的參考價值,感興趣的可以了解一下2023-08-08