主題

【C# 學習筆記 】Async的奇妙冒險 (完?)

趴趴鼠Loading | 2020-12-05 20:37:24


前言:
之前講過的排程系統是做出個大綱了啦....不過Unity 不支援多線程,所以只能用debug畫面示意,且東西也沒太大用處。(Unity 連 UI的text屬性都不給多線程方法取用)



Demo

說明:
我預設3種任務: Idle, Move , Dash,其中Idle優先度最低,Move次中,Dash最高且可以斷別人。 這3個任務都持續1秒。按A會產生Idle,按S會產生Move,按D會產生Dash任務給工具。

方法都很單純:
(這些方法原本是要由其他腳本傳入,讓工具做排程,所以沒設成async。)

其他的方法在github。


停止 Async task

不知道是不是哪裡出錯,若不加await就無法接收到token回傳的終止訊息(如下圖第二行就無法接收)。

啟動方法
執行到 var result那行後會等待ProcessActionQueue方法回傳後才繼續執行下面的,所以可以用回傳的值去了解方法是以什麼方式結束的。


對於token的用法教學,我是看:
簡單的理解是,當token呼叫 Cancel()時,會傳訊息到token.IsCancellationRequested。所以在迴圈裡面用判斷式去抓取消的訊號即可。





其他隨手筆記:

async void無法使用await

如下圖,只有第一行Task.Run才能啟動async void。
讀完這篇,裡面大致的內容是說async void方法只適合用在UI按鈕等操作, 若用async void方法去跑些背景程式,且背景程式被中斷時,中斷的exception因為沒task等容器去裝,所以會直接丟到最上層,使整個app crash掉,且無法回復原本的行程。 若用async task方法,中斷時產生的exception會丟給task,我們可以掌控,並對他做後續處理。



CancellationTokenSource使用過Cancel()後要再new一次才能使用。

Action型態傳入的方法變數被當成回傳void方法(?),所以一樣不能用await。



最後,我可能還是要改回去研究用corotuine做,雖然Unity有搞個job system,也有提供不錯的教學影片,但這感覺會讓專案多出不必要的複雜度。 各有長短吧!



???
159 巴幣: 8

創作回應

教授加博士先生
Unity的Job我覺得就是個雷,2018半成品出來到現在就是API換來換去,架構會來換去,Unity近年各種被詬病地方 真的不得已要用再說,不然真的正常coro打天下DD
2020-12-05 20:56:57
追蹤 創作集

作者相關創作

更多創作