iT邦幫忙

2021 iThome 鐵人賽

DAY 12
0
Modern Web

30天的asp.net core實習生活-從入門到進階技巧系列 第 12

D-20 非同步 ? async ? await

如何同時進行

昨天的日子中小光學到了如何使用delegateLinq,這讓小光在資料處理中的程式開發大大進步,不過在資料量大時執行速度就顯得緩慢,所以小光就把這問題拿來請教大頭,看看大頭有什麼解法。

本文同步放置於此

非同步程式開發

「前輩,我昨天學到delegateLinq之後立刻回家試驗,果真可以把語法寫得好簡潔唷,不過有遇到執行速度很慢的問題耶」
聽到這個,大頭跟以往的埋頭苦幹不一樣,這時立刻抬起頭來不解地看著小光這樣子問。
「你的資料到底是多大啊,大到執行速度很慢。照理來說幾千幾萬筆資料的Linq在現在電腦來說應該不會慢才對,不過超過的話就不敢肯定了。」
聽完大頭這麼說,小光陷入了沈思之中,努力地思索自己到底寫了什麼,過了一陣子後小光才這麼說。
「會不會我寫了一堆判斷式跟一堆程式邏輯在Linq內。」
聽完小光的說明後大頭點點頭,並且這樣說。
「有可能喔,因為簡潔所以通常會有人寫的包山包海,這樣會造成執行速度不彰,除此之外也要慎選資料結構喔如果有唯一Key時需要用Dictionary這樣可以改善效能不彰的狀況。」
講完之後換大頭陷入沈思之中,待過了幾分鐘後大頭這樣子說。
「不過如果真的需要處理的東西太多時,那就要考慮使用非同步程式設計。」
聽到這個小光眼睛又亮了起來。

Thread

要介紹非同步程式設計就不能不提到執行序這概念,執行序就是作業系統透過CPU在原來的程序中產生一條平行的線程,並在那線程處理資料,然後C#的Thread就是利用作業系統的執行序來處理資料,然後這邊不多做說明,因為OS層級的操作,所以成本耗費較多,再來是無法有回傳值以及無法取消等因素所以使用上有諸多限制,因此今天只介紹常用的Task

Task

關於Task的用法有兩種,其中比較舊的寫法是透過Task.Factory.StartNew來產生一個新的Task,但是Task.Factory.StartNew中建議除非需要,否則建議直接使用Task.Run,所以接下來請大家看一下以下範例。

Console.WriteLine("Main Start Step1");
Task.Run(() =>
{
    Console.WriteLine("Task Start Step2");
});
Console.WriteLine("Main End Step3");

上述例子的結果如何呢,Task.Run內的方法在最後一個執行完才接著執行,所以結果如下所示。

Main Start Step1
Main End Step1
Task Start Step2

不過這樣寫又多了很多贅詞,而且閱讀上不是那麼清楚,所以最後要介紹語法糖asyncawait

async await

在非同步程式設計中最後要介紹的是asyncawait,其實這兩個東西跟之前所說的Task沒有衝突,只不過是為了讓程式語法寫得更簡潔而已,所以接下來我們看看要怎麼寫。

        public async Task Print(string msg)
        {
            Console.WriteLine(msg);
        }

        public async Task DoPrint()
        {
            await Task.Delay(TimeSpan.FromSeconds(1));
            await Print("This is message");
        }

        public async Task DoNotWait()
        {
            Print("This is begin");
            DoPrint();
            await Task.Delay(TimeSpan.FromSeconds(1));
            await Print("This is end");
            Console.WriteLine("This is finish");
        }

為了要凸顯程序跑的時間序所以在例子中做了一些Task.Delay的等待,簡單說明一下就是在方法上宣告async代表這個方法是非同步的方法,而是否要等待就取決於呼叫該方法時有沒有加上await的修飾詞。
所以上述的結果會如下內容所示。

This is begin
This is end
This is finish
This is message

後記

「前輩學了非同步程式開發後讓我對於程式開發有多一些認識,但是我覺得頭好暈啊。」
在聽完大頭的介紹之後小光這麼說,然後大頭聽完小光的感想後哈哈大笑並且這麼說。
「哈哈哈,沒關係啦這是程式設計的必經之路,遇到不懂後把他搞懂,接下來要跟你開始介紹網頁程式開發囉,敬請期待唷。」


上一篇
D-21 委派 ? delegate ? Action ? Linq
下一篇
D-19 網頁站台 ? webapp ? mvc ? webapi
系列文
30天的asp.net core實習生活-從入門到進階技巧31

尚未有邦友留言

立即登入留言