欧美大屁股bbbbxxxx,狼人大香伊蕉国产www亚洲,男ji大巴进入女人的视频小说,男人把ji大巴放进女人免费视频,免费情侣作爱视频

歡迎來到入門教程網!

C#教程

當前位置:主頁 > 軟件編程 > C#教程 >

C#關鍵字async/await用法

來源:本站原創(chuàng)|時間:2020-01-10|欄目:C#教程|點擊: 次

經過一番的探索,終于搞清楚關鍵字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

網頁制作CMS教程網絡編程軟件編程腳本語言數(shù)據庫服務器

如果侵犯了您的權利,請與我們聯(lián)系,我們將在24小時內進行處理、任何非本站因素導致的法律后果,本站均不負任何責任。

聯(lián)系QQ:835971066 | 郵箱:835971066#qq.com(#換成@)

Copyright © 2002-2020 腳本教程網 版權所有