c# async和await 用法(阻塞與不阻塞)

來源:互聯網
上載者:User

標籤:邏輯   read   需要   方法   內容   string   使用者   請求   footer   

void PagePaint(){    Console.WriteLine("Paint Start");    Paint();    Console.WriteLine("Paint End");}void Paint(){    Rendering("Header");    Rendering(RequestBody());    Rendering("Footer");}string RequestBody(){    Thread.Sleep(1000);    return "Body";}

假設有這麼個頁面配置的方法,依次對頭部、主體和底部進行渲染,頭部和底部是固定的內容,而主體需要額外請求。
這裡用Sleep類比網路延時,Rendering方法其實也就是對Console.WriteLine的簡單封裝而已。。。
PagePaint運行過後,結果是這樣的:

Paint StartHeaderBodyFooterPaint End

挺正常的結果,但是Header渲染完以後頁面就阻塞了,這個時候使用者沒法對Header進行操作。
於是就進行這樣的修正:

async void Paint(){    Rendering("Header");    Rendering(await RequestBody());    Rendering("Footer");}async Task<string> RequestBody(){    return await Task.Run(() =>    {        Thread.Sleep(1000);        return "Body";    });}

 

運行結果變成了這樣:

Paint StartHeaderPaint EndBodyFooter

這樣就能在Header出現之後不阻塞主線程了。

不過呢,Footer一直都得等到Body渲染完成後才能被渲染,這個邏輯現在看來還沒問題,因為底部要相對於主體進行布局。
然而我這時候又想給頁面加一個廣告,而且是fixed定位的那種,管啥頭部主體想蓋住就蓋住,你們在哪它不管。
比如這樣寫:

async void Paint(){    Rendering(await RequestAds());    Rendering("Header");    Rendering(await RequestBody());    Rendering("Footer");}

出現了很嚴重的問題,頭部都得等廣告載入好了才能渲染,這樣顯然是不對的。
所以應該改成這樣:

async void Paint(){    PaintAds();    Rendering("Header");    Rendering(await RequestBody());    Rendering("Footer");}async void PaintAds(){    string ads = await Task.Run(() =>    {        Thread.Sleep(1000);        return "Ads";    });    Rendering(ads);}

這樣的運行結果就算令人滿意了:

Paint StartHeaderPaint EndAdsBodyFooter

 

c# async和await 用法(阻塞與不阻塞)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.