.NET 多執行緒走到現今這個現況,讓後來接觸的人,沒事多非同步,非同步沒事,讓.NET的
非同步世界,如同喝水呼吸般的輕鬆自在,遙想以前都要全集中呼吸~,接下來紀錄一下手感
非同步世界,如同喝水呼吸般的輕鬆自在,遙想以前都要全集中呼吸~,接下來紀錄一下手感
基本非同步任務,使用 Task.Factory 直接建立非同步任務,並且搭配 lambda 傳入匿名委派
方法,此結果如同預期先印出 Async run ,後等待1秒,印出 Done!
方法,此結果如同預期先印出 Async run ,後等待1秒,印出 Done!
若有需要完成某個非同步任務後,接緒著執行另一段程式,可以使用 ContinueWith()
程式會先等待1秒後印出 asnyc process...,接著再等待2秒後,印出 async done!
若需要等待多個非同步任務完成後,才繼續接下來的任務呢?可以使用類似 jquery 的
$.when()作法,使用 wait 系列方法等待,如 wait.any(),wait.all()
$.when()作法,使用 wait 系列方法等待,如 wait.any(),wait.all()
而此方法,可以看到會先停在 waitany 方法這邊,待有任一非同步任務完成後(等5秒的先完成),
往下印出 waitany passed,接著會在 waitall 方法這邊再等一下,最後印出 waitall passed
往下印出 waitany passed,接著會在 waitall 方法這邊再等一下,最後印出 waitall passed
若非同步任務有回傳值,該怎麼處理?其實也是在使用StartNew建立非同步方法時,有多載
可以設定回傳資料型別,如下圖所示,而使用 task.Result 來存取物件
可以設定回傳資料型別,如下圖所示,而使用 task.Result 來存取物件
接下來,在for 迴圈中搭配非同步使用看看
結果則會有多種,如下所示
這是因為for 迴圈裡面放了非同步程式(task),當程式執行到這邊,就會分出任務,for 迴圈
持續加1,直到加至1500 的時候,判斷不符則跳出,而多少個非同步未完成早就不關它的
事情了,所以才會多執行幾次程式結果都不一定的狀況。值得注意的是,若非同步裡面加
個 Thread.Sleep(number); 其中 number 輸入一定數值,其total 結果大都是0。
持續加1,直到加至1500 的時候,判斷不符則跳出,而多少個非同步未完成早就不關它的
事情了,所以才會多執行幾次程式結果都不一定的狀況。值得注意的是,若非同步裡面加
個 Thread.Sleep(number); 其中 number 輸入一定數值,其total 結果大都是0。
沒有留言:
張貼留言