C#關鍵字async/await用法
經過一番的探索,終于搞清楚關鍵字async/await 在.net4.5之后可用的巧妙之處,在這里記錄一下也與大家分享一下個人的心得體會
async:異步執(zhí)行
await:異步執(zhí)行中的等待其執(zhí)行完(最大的優(yōu)點是它是后臺等待,因此不阻塞GUI,界面交互非常的好)
使用async方法要定義async Task或者async Task<T> 最好不要定義async void方法來調用,async void是處理程序等,總結結論就是要使用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行注釋,使用接收值來接收async方法,該方法會立即返回值,主程序繼續(xù)向下執(zhí)行,該方法后臺繼續(xù)跑。
那么肯定有小伙伴與我當初有同樣的疑惑,這樣我執(zhí)行用線程在這里執(zhí)行不也可以嗎?為什么要用async關鍵字呢,他到底有什么好處?
比如有一種情況:我的主線程如何有需要休眠等待的情況,那么直接使用Thread.Sleep(),會使界面卡死,如果此時我將方法修改為async,那么只需要await Task.Delay() 這樣也會等待時間完成后再向下執(zhí)行,但是它不會使主界面處于假死狀態(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í)行"; }
再次重復一點,在async方法中使用接收值來接收Task,會使得Task不必加上await關鍵字而被迫使得主線程需要等待它執(zhí)行完才能向下執(zhí)行,接收值的目的就是立即得到返回值
使用接收值來接收Task會直接返回,代碼繼續(xù)向下執(zhí)行,這一點很重要?。?!
上圖的第3行,如下:
await Task.Delay(1000);
其中await只能用在異步方法中,await會使得該線程等待await處的線程執(zhí)行完,方可執(zhí)行下方代碼,正如該處代碼所示,使用await Task.Delay(100); 代替 Thread.Sleep(100)
以上就是我們給大家整理的全部知識點,希望能夠幫助到大家。
上一篇:詳解C#讀寫Excel的幾種方法
欄 目:C#教程
下一篇:C#在foreach遍歷刪除集合中元素的三種實現(xiàn)方法
本文標題:C#關鍵字async/await用法
本文地址:http://mengdiqiu.com.cn/a1/C_jiaocheng/4585.html
您可能感興趣的文章
- 01-10C#中Override關鍵字和New關鍵字的用法詳解
- 01-10C#編程中使用ref和out關鍵字來傳遞數(shù)組對象的用法
- 01-10C# partial關鍵字說明
- 01-10C#中AS和IS關鍵字的用法
- 01-10在C#中global關鍵字的作用及其用法
- 01-10C#基礎知識之new關鍵字介紹
- 01-10C#基礎知識之this關鍵字介紹
- 01-10C#基礎知識之base關鍵字介紹
- 01-10深入理解C#中new、override、virtual關鍵字的區(qū)別
- 01-10C#中實現(xiàn)線程同步lock關鍵字的用法詳解


閱讀排行
本欄相關
- 01-10C#通過反射獲取當前工程中所有窗體并
- 01-10關于ASP網頁無法打開的解決方案
- 01-10WinForm限制窗體不能移到屏幕外的方法
- 01-10WinForm繪制圓角的方法
- 01-10C#實現(xiàn)txt定位指定行完整實例
- 01-10WinForm實現(xiàn)仿視頻 器左下角滾動新
- 01-10C#停止線程的方法
- 01-10C#實現(xiàn)清空回收站的方法
- 01-10C#通過重寫Panel改變邊框顏色與寬度的
- 01-10C#實現(xiàn)讀取注冊表監(jiān)控當前操作系統(tǒng)已
隨機閱讀
- 04-02jquery與jsp,用jquery
- 08-05dedecms(織夢)副欄目數(shù)量限制代碼修改
- 01-10C#中split用法實例總結
- 01-11ajax實現(xiàn)頁面的局部加載
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 08-05DEDE織夢data目錄下的sessions文件夾有什
- 01-10使用C語言求解撲克牌的順子及n個骰子
- 01-10SublimeText編譯C開發(fā)環(huán)境設置
- 08-05織夢dedecms什么時候用欄目交叉功能?
- 01-10delphi制作wav文件的方法