国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C# > 正文

C#關鍵字async/await用法

2020-01-24 00:01:20
字體:
來源:轉載
供稿:網友

經過一番的探索,終于搞清楚關鍵字async/await 在.net4.5之后可用的巧妙之處,在這里記錄一下也與大家分享一下個人的心得體會

async:異步執行

await:異步執行中的等待其執行完(最大的優點是它是后臺等待,因此不阻塞GUI,界面交互非常的好)

使用async方法要定義async Task或者async Task<T> 最好不要定義async void方法來調用,async void是處理程序等,總結結論就是要使用async Task或者async Task<T>

使用asyn方法,可以用同步的格式,執行異步的代碼,如下:

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();//前面接收值,這樣方法立即返回,主線程繼續執行      //eee.IsCompleted      textBox3.Text = "主線程繼續向下執行";    }    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方法,該方法會立即返回值,主程序繼續向下執行,該方法后臺繼續跑。

那么肯定有小伙伴與我當初有同樣的疑惑,這樣我執行用線程在這里執行不也可以嗎?為什么要用async關鍵字呢,他到底有什么好處?

比如有一種情況:我的主線程如何有需要休眠等待的情況,那么直接使用Thread.Sleep(),會使界面卡死,如果此時我將方法修改為async,那么只需要await Task.Delay() 這樣也會等待時間完成后再向下執行,但是它不會使主界面處于假死狀態,如下:

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();//前面接收值,這樣方法立即返回,主線程繼續執行      //eee.IsCompleted      textBox3.Text = "主線程繼續向下執行";    }

再次重復一點,在async方法中使用接收值來接收Task,會使得Task不必加上await關鍵字而被迫使得主線程需要等待它執行完才能向下執行,接收值的目的就是立即得到返回值

使用接收值來接收Task會直接返回,代碼繼續向下執行,這一點很重要!!!

上圖的第3行,如下:

await Task.Delay(1000);

其中await只能用在異步方法中,await會使得該線程等待await處的線程執行完,方可執行下方代碼,正如該處代碼所示,使用await Task.Delay(100); 代替 Thread.Sleep(100)

以上就是武林網給大家整理的全部知識點,希望能夠幫助到大家。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 丽水市| 加查县| 洛南县| 繁峙县| 睢宁县| 永年县| 广汉市| 嵊泗县| 读书| 泰安市| 马龙县| 嘉禾县| 包头市| 阜城县| 沂源县| 九龙县| 苍溪县| 资源县| 江北区| 南溪县| 唐河县| 襄城县| 体育| 武城县| 浑源县| 宁陵县| 永寿县| 壤塘县| 安泽县| 谷城县| 九寨沟县| 公主岭市| 封开县| 宁陕县| 寻甸| 盐城市| 翼城县| 大方县| 太和县| 大港区| 汕尾市|