ç¸å¯¹äºä¹åBegin/End模å¼åäºä»¶æ¨¡å¼ï¼async/await模å¼è®©ç¨åºåå¾ä»¥ç¨åæ¥ç代ç ç»æè¿è¡å¼æ¥ç¼ç¨ãasync/awaitå ¥é¨å¾æ¹ä¾¿ï¼ä½æ¯æ·±å ¥ç解å´æ¶åå¾å¤é¢åï¼å¦çº¿ç¨æ± ãåæ¥ä¸ä¸æççãæææç»ç»æ¥è§¦äºå 个æï¼ç¨å¾®æä¸äºå¿å¾ï¼
awaitçä½ç¨æ¯çå¾ å¼æ¥Taskå®æï¼å¹¶ä¸æ¯é»å¡çã举个ä¾åï¼ä¸ä¸ªå¼æ¥æ¹æ³ï¼
public async Task Caller()A. å½ä½ å¨éUI线ç¨Aä¸æ§è¡Caller()ï¼å°å®æ以ä¸å 件äºï¼
[线ç¨A]æ§è¡Action0()
[线ç¨A]è°ç¨await Method()
[线ç¨A]æ§è¡Action1()
[线ç¨A]å¯å¨ä»»å¡Task.Delay(1000)ï¼å¹¶å¨çº¿ç¨æ± éå®æä¸ä¸ªæ°ä»»å¡ï¼å¨Task.Delay(1000)å®æåï¼ç±å¦ä¸ä¸ªçº¿ç¨æ§è¡6
[线ç¨A]å»å¤çå«çäºæ
[线ç¨B]æ§è¡Action2()
[线ç¨B]await Method()è¿å
[线ç¨B]æ§è¡Action3()
å ¶ä¸ï¼çº¿ç¨Aå线ç¨B并ä¸ä¿è¯æ¯åä¸ä¸ªçº¿ç¨ãå¦æä½ å¨awaitååæå°çº¿ç¨IDï¼ä½ ä¼åç°IDæ¯ä¸åçã
B. å½ä½ å¨UI线ç¨ä¸æ§è¡Caller()ï¼è¿ç¨æäºååï¼
[UI线ç¨]æ§è¡Action0()
[UI线ç¨]è°ç¨await Method()
[UI线ç¨]æ§è¡Action1()
[UI线ç¨]å¯å¨ä»»å¡Task.Delay(1000)ï¼å¹¶å¨çº¿ç¨æ± éå®æä¸ä¸ªæ°ä»»å¡ï¼å¨Task.Delay(1000)å®æåï¼ç±å¦ä¸ä¸ªçº¿ç¨æ§è¡6
[UI线ç¨]å»å¤çå«çäºæ
[线ç¨C]å¨UI线ç¨çåæ¥ä¸ä¸æä¸æ§è¡7ï¼ç±»ä¼¼äºå¨çªä½ç±»ä¸æ§è¡Invoke()æ¹æ³ï¼
[UI线ç¨]æ§è¡Action2()
[UI线ç¨]await Method()è¿å
[UI线ç¨]æ§è¡Action3()
å¯è§ï¼å½ä½¿ç¨awaitæ¹æ³ç线ç¨ä¸ºUI线ç¨æ¶ï¼ç¨åºé»è®¤ä¼éè¿ç¬¬6æ¥ï¼ä¿è¯awaitååæ¯åä¸ä¸ªçº¿ç¨IDãè¿ä¸ªå½ç¶æ¯æä¸å®æ§è½çºç²çï¼çè³ä¼é ææ»éï¼å¨Déä¼è®¨è®ºï¼ï¼å¦æä½ ä¸æ³å¨awaitå®æååå°UI线ç¨ï¼è§Cã
C. ä½ å¯ä»¥å¨UI线ç¨ä¸ä½¿ç¨await XXX().ConfigureAwait(false)å»æ¿ä»£await XXX()ï¼æ¥ç¦æ¢å½await XXX()ç»ææ¶æ¢å¤çº¿ç¨ã举个ä¾åï¼æ§è¡ä¸å代ç æ¯æ²¡é®é¢çï¼å¦Béæè¿°çï¼ï¼
private async void button1_Click(object sender, EventArgs e)ä½æ¯ï¼æ§è¡ä¸å代ç å°±ä¼åçâ线ç¨é´æä½æ æâçé误ï¼
private async void button1_Click(object sender, EventArgs e)å 为æ§è¡
this.Text = "321";ç线ç¨å·²ç»ä¸åæ¯UI线ç¨ã
D. 顺便ä¸æï¼Task.Wait()æ¹æ³ï¼ç¸æ¯äºawait Taskï¼ä¼åæ¥å°æ§è¡Taskãä½æ¯ï¼å¦æä½ å¨UI线ç¨ä¸WaitçTaskéæ¬èº«åæawaitï¼é£ä¹å°ä¼äº§çæ»éï¼
private void Foo(object sender, EventArgs e)为ä»ä¹å¢ï¼Method().Wait()ä¼é»å¡UI线ç¨çå¾ Method()å®æï¼ä½æ¯åç §Bè¿ç¨ï¼å¨awaitå®æåï¼Method()å®æåï¼æ¯éè¦æ¢å¤å°UI线ç¨çï¼ä½æ¯æ¤æ¶UI线ç¨å·²ç»è¢«é»å¡äºï¼å æ¤æ»éå°±åçäºã
è¦é¿å è¿ä¸ªæ»éï¼å¯ä»¥åç §Cã
E. 说åºæ¥ä½ å¯è½ä¸ä¿¡ï¼ä¸é¢çé½æ¯æææçãå¨å 容ä¸è½ç¶ä¸ä¸å®ä¸¥è°¨ï¼ä½å¸æ对楼主åå ¶å®æ°æ¥è§¦TAPçæåæä¸å®å¯åã