2020年4月14日 星期二

非同步利器 Task 初體驗

.NET 多執行緒走到現今這個現況,讓後來接觸的人,沒事多非同步,非同步沒事,讓.NET的
非同步世界,如同喝水呼吸般的輕鬆自在,遙想以前都要全集中呼吸~,接下來紀錄一下手感




基本非同步任務,使用 Task.Factory 直接建立非同步任務,並且搭配 lambda 傳入匿名委派
方法,此結果如同預期先印出 Async run ,後等待1秒,印出 Done!



若有需要完成某個非同步任務後,接緒著執行另一段程式,可以使用 ContinueWith()

程式會先等待1秒後印出 asnyc process...,接著再等待2秒後,印出 async done!

若需要等待多個非同步任務完成後,才繼續接下來的任務呢?可以使用類似 jquery 的
$.when()作法,使用 wait 系列方法等待,如 wait.any(),wait.all()



而此方法,可以看到會先停在 waitany 方法這邊,待有任一非同步任務完成後(等5秒的先完成),
往下印出 waitany passed,接著會在 waitall 方法這邊再等一下,最後印出 waitall passed

若非同步任務有回傳值,該怎麼處理?其實也是在使用StartNew建立非同步方法時,有多載
可以設定回傳資料型別,如下圖所示,而使用 task.Result 來存取物件



接下來,在for 迴圈中搭配非同步使用看看

結果則會有多種,如下所示

這是因為for 迴圈裡面放了非同步程式(task),當程式執行到這邊,就會分出任務,for 迴圈
持續加1,直到加至1500 的時候,判斷不符則跳出,而多少個非同步未完成早就不關它的
事情了,所以才會多執行幾次程式結果都不一定的狀況。值得注意的是,若非同步裡面加
個 Thread.Sleep(number); 其中 number 輸入一定數值,其total 結果大都是0。


沒有留言:

張貼留言