一、 為什么需要異步編程
異步點(diǎn)餐的優(yōu)點(diǎn):能同時(shí)服務(wù)多個(gè)客人
異步點(diǎn)餐一定會(huì)提升單個(gè)客戶點(diǎn)餐速度嗎?
答案理所當(dāng)然:不能
圖片美化服務(wù)例子服務(wù)器能夠同時(shí)服務(wù)的請(qǐng)求數(shù)量有限
void BeautifyPic (File photo, Response response)
{
byte[] bytes = 美化圖片(photo);
response.Write(bytes):
}
處理完成后再回調(diào),異步回調(diào)通知的。就可以同時(shí)處理更多的請(qǐng)求
傳統(tǒng)多線程開發(fā)太麻煩。C#關(guān)鍵字;
async、await。async、await不等于“多線程
二、async await 基本使用
“異步方法”:用async關(guān)鍵字修飾的方法
1、異步方法的返回值一般是Task,T是真正的返回值類型,Task。慣例: 異步方法名字以Async結(jié)尾。
2、即使方法沒有返回值,也最好把返回值聲明為非泛型的Task。
3、調(diào)用泛型方法時(shí),一般在方法前加上await關(guān),這樣拿到的返回值就是泛型指定的T類型
4、異步方法的“傳染性”:一個(gè)方法中如果有await調(diào)用,則這個(gè)方法也必須修飾為async(其他都是同步方法,只要有一句異步,這個(gè)方法就必須修飾未async)
static async Task Main(string[] args)
{
string fileName = "d:/1.txt"File.Delete(fileName);
File.WriteAllTextAsync(fileName, "hello async");
string s = await File.ReadAllTextAsync(fileName);
Console.Writeline(s);
}
試一試異步
新建控制臺(tái)應(yīng)用
同步方式
運(yùn)行結(jié)果:
異步方式
此時(shí)主方法需要改為
若去掉await
此時(shí)文件 也能生成(留下疑問)
讀取的兩種方式 ,第一種會(huì)自動(dòng)轉(zhuǎn)換(是第二種的兩句合并)
不加await 運(yùn)行效果 是因?yàn)?寫入hello 字符得速度很快
嘗試加入 大字符
運(yùn)行
WriteAllTextAsync == 獨(dú)占式寫入==,正在寫的途中是不能 讀出數(shù)據(jù)
不寫await 是啟動(dòng)寫入后,不等寫完 就繼續(xù)執(zhí)行下面的語(yǔ)句
因?yàn)榈诙写a是異步,可能會(huì)先于第一行執(zhí)行,要么都異步,要么都同步
加入await之后:
運(yùn)行結(jié)果:
三、編寫異步方法
不帶返回值
運(yùn)行:
查看文件:
帶返回值
運(yùn)行結(jié)果:
【注意】
如果同樣的功能,既有同步方法,又有異步方法,那么首先使用異步方法。 .NET5中,很多框架中的方法也都支持異步:Main、WinForm事件處理函數(shù)。
對(duì)于不支持的異步方法怎么辦? Wait()(無返回值);Rest(有返回值)。
風(fēng)險(xiǎn):死鎖。盡量不用
winform中 異步方法得使用
同步方式
運(yùn)行結(jié)果:
異步方式
運(yùn)行結(jié)果:
會(huì)報(bào)錯(cuò),winform 委托函數(shù)已經(jīng)規(guī)定了 返回值必須是void
修改會(huì)void
運(yùn)行結(jié)果
對(duì)于不支持異步得情況
假如說 只能調(diào)用異步的方法,Main 又不支持異步
result 方式
運(yùn)行結(jié)果:
await會(huì)暫時(shí)退出當(dāng)前函數(shù),result是阻塞當(dāng)前線程
wait 方式
運(yùn)行結(jié)果:
異步委托
ThreadPool.QueueUserWorkItem(async(obj) => {
await SomeAsync();
});
測(cè)試
運(yùn)行:
異步方式
修改:異步的文章來源:http://www.zghlxwxcb.cn/news/detail-791751.html
運(yùn)行結(jié)果:文章來源地址http://www.zghlxwxcb.cn/news/detail-791751.html
到了這里,關(guān)于楊中科 .NETCORE 異步編程的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!