ETH官方钱包

前往
大廳
主題

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

%%鼠 拒收病婿 | 2020-12-05 20:37:24 | 巴幣 8 | 人氣 1319


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



Demo

說明:
我預(yù)設(shè)3種任務(wù): Idle, Move , Dash,其中Idle優(yōu)先度最低,Move次中,Dash最高且可以斷別人。 這3個任務(wù)都持續(xù)1秒。按A會產(chǎn)生Idle,按S會產(chǎn)生Move,按D會產(chǎn)生Dash任務(wù)給工具。

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

其他的方法在github。


停止 Async task

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

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


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





其他隨手筆記:

async void無法使用await

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



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

Action型態(tài)傳入的方法變數(shù)被當(dāng)成回傳void方法(?),所以一樣不能用await。



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



???
送禮物贊助創(chuàng)作者 !
0
留言

創(chuàng)作回應(yīng)

派大星教授死掉了咩噗
Unity的Job我覺得就是個雷,2018半成品出來到現(xiàn)在就是API換來換去,架構(gòu)會來換去,Unity近年各種被詬病地方 真的不得已要用再說,不然真的正常coro打天下DD
2020-12-05 20:56:57
御安鴨·摸頭害鴨哭
努力看懂了...幹我還不知道函式庫怎麼寫
2021-07-07 21:48:08
追蹤 創(chuàng)作集

作者相關(guān)創(chuàng)作

更多創(chuàng)作