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