C#關(guān)鍵字async/await用法
經(jīng)過(guò)一番的探索,終于搞清楚關(guān)鍵字async/await 在.net4.5之后可用的巧妙之處,在這里記錄一下也與大家分享一下個(gè)人的心得體會(huì)
async:異步執(zhí)行
await:異步執(zhí)行中的等待其執(zhí)行完(最大的優(yōu)點(diǎn)是它是后臺(tái)等待,因此不阻塞GUI,界面交互非常的好)
使用async方法要定義async Task或者async Task<T> 最好不要定義async void方法來(lái)調(diào)用,async void是處理程序等,總結(jié)結(jié)論就是要使用async Task或者async Task<T>
使用asyn方法,可以用同步的格式,執(zhí)行異步的代碼,如下:
int a = 0;
private void button1_Click(object sender, EventArgs e)
{
Task.Run(()=> {
Stopwatch sw = new Stopwatch();
sw.Start();
Thread.Sleep(2000);
sw.Stop();
SetText(textBox1,this, sw.ElapsedMilliseconds.ToString());
});
var eee=Ce_async();//前面接收值,這樣方法立即返回,主線程繼續(xù)執(zhí)行
//eee.IsCompleted
textBox3.Text = "主線程繼續(xù)向下執(zhí)行";
}
private async Task Ce_async()
{
await Task.Run(async ()=> {
while (true)
{
await Task.Delay(100);//Thread.Sleep(2000);23 a += 1;
SetText(textBox2, this, a.ToString());
}
});
}
private delegate void SetTextdelegate(Control cr,Form f,string str);
private void SetText(Control cr, Form f, string str)
{
if (f.InvokeRequired) { f.Invoke(new SetTextdelegate(SetText), cr, f, str); }
else { cr.Text = str; }
}
正如上圖第11行注釋,使用接收值來(lái)接收async方法,該方法會(huì)立即返回值,主程序繼續(xù)向下執(zhí)行,該方法后臺(tái)繼續(xù)跑。
那么肯定有小伙伴與我當(dāng)初有同樣的疑惑,這樣我執(zhí)行用線程在這里執(zhí)行不也可以嗎?為什么要用async關(guān)鍵字呢,他到底有什么好處?
比如有一種情況:我的主線程如何有需要休眠等待的情況,那么直接使用Thread.Sleep(),會(huì)使界面卡死,如果此時(shí)我將方法修改為async,那么只需要await Task.Delay() 這樣也會(huì)等待時(shí)間完成后再向下執(zhí)行,但是它不會(huì)使主界面處于假死狀態(tài),如下:
private async void button1_Click(object sender, EventArgs e)
{
await Task.Delay(1000);
var aaa=Task.Run(() =>
{
Stopwatch sw = new Stopwatch();
sw.Start();
Thread.Sleep(2000);
sw.Stop();
SetText(textBox1, this, sw.ElapsedMilliseconds.ToString());
});
var eee=Ce_async();//前面接收值,這樣方法立即返回,主線程繼續(xù)執(zhí)行
//eee.IsCompleted
textBox3.Text = "主線程繼續(xù)向下執(zhí)行";
}
再次重復(fù)一點(diǎn),在async方法中使用接收值來(lái)接收Task,會(huì)使得Task不必加上await關(guān)鍵字而被迫使得主線程需要等待它執(zhí)行完才能向下執(zhí)行,接收值的目的就是立即得到返回值
使用接收值來(lái)接收Task會(huì)直接返回,代碼繼續(xù)向下執(zhí)行,這一點(diǎn)很重要!??!
上圖的第3行,如下:
await Task.Delay(1000);
其中await只能用在異步方法中,await會(huì)使得該線程等待await處的線程執(zhí)行完,方可執(zhí)行下方代碼,正如該處代碼所示,使用await Task.Delay(100); 代替 Thread.Sleep(100)
以上就是腳本之家給大家整理的全部知識(shí)點(diǎn),希望能夠幫助到大家。
相關(guān)文章
C#實(shí)現(xiàn)過(guò)濾sql特殊字符的方法集合
這篇文章主要介紹了C#實(shí)現(xiàn)過(guò)濾sql特殊字符的方法,以實(shí)例形式分析總結(jié)了C#針對(duì)SQL危險(xiǎn)字符的幾種常用的過(guò)濾技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2015-11-11
C#實(shí)現(xiàn)圖片上傳(PC端和APP)保存及 跨域上傳說(shuō)明
這篇文章主要介紹了C#實(shí)現(xiàn)圖片上傳(PC端和APP)保存及 跨域上傳說(shuō)明的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-12-12
c#測(cè)試本機(jī)sql運(yùn)算速度的代碼示例分享
本文代碼目的很簡(jiǎn)單,就是使用c#測(cè)試一下本機(jī)sql運(yùn)算的速度,使用循環(huán)往數(shù)據(jù)里大量插入數(shù)據(jù),計(jì)算所用時(shí)間,大家參考使用吧2014-01-01
c#實(shí)現(xiàn)數(shù)據(jù)同步的方法(使用文件監(jiān)控對(duì)象filesystemwatcher)
這篇文章主要介紹了C#使用文件監(jiān)控對(duì)象FileSystemWatcher實(shí)現(xiàn)數(shù)據(jù)同步,大家參考使用吧2013-12-12
在.NET框架使用C#實(shí)現(xiàn)PDF文件轉(zhuǎn)為HTML格式的步驟
HTML作為一種開(kāi)放標(biāo)準(zhǔn)的網(wǎng)頁(yè)標(biāo)記語(yǔ)言,具有跨平臺(tái)、易于瀏覽和搜索引擎友好的特性,通過(guò)將PDF文件轉(zhuǎn)換為HTML格式,我們可以更方便地在瀏覽器中展示PDF文檔內(nèi)容,本文將介紹如何在.NET框架使用C#將PDF文件轉(zhuǎn)換為HTML格式,需要的朋友可以參考下2025-01-01

