認爲我必須從服務器獲取登錄信息,然後登錄,那麼以後登錄下一步做什麼。目標是將所有這些封裝成調用者可以等待的東西。任務在火力地堡團結鏈接,如何避免代碼金字塔?
但是,每個Firebase C#API調用都已返回單獨的任務(已經啓動)。我的方法是考慮如何將這些單獨的任務鏈接在一起。
我想製作一個新Task
表示這一點,因爲它似乎也非常適合聚集所有呼叫者趕上例外。
我們有
Task<DataSnapshot> getKeyTask = Database.Child("keyLocation").GetValueAsync();
GetValueAsync
據我瞭解已經紡出任務。我們可以觀察返回的任務,或者更好地使用延續來完成任務。
Task loginTask = Auth.SignInWithEmailAndPasswordAsync(username, password);
Auth.SignInWithEmailAndPasswordAsync
也轉動了新任務本身。我也可以使用continuation來等待並開始其他事情。
登錄後我想用另一個數據庫調用來獲取用戶數據。
所以
public Task Login()
{
Task<DataSnapshot> getKeyTask = Database.Child("keyLocation").GetValueAsync();
Task loginAfterGetKeyTask = getKeyTask.ContinueWith(gkt =>
{
Task loginTask = Auth.SignInWithEmailAndPasswordAsync(gkt.Result.___.username, gkt.Result.____.password);
loginTask.ContinueWith(lt => { ....the next task.... });
});
return loginAfterGetKeyTask;
}
有2個問題,我發現:
- 隨着它去上的代碼被越來越金字塔更深。有什麼辦法可以讓代碼看起來更順序嗎?
- 這
Login()
函數我想返回一個Task
,以便調用者可以等待整個登錄過程完成然後繼續等等。但是,當前返回的loginAfterGetKey
任務完成,即使裏面還有更多事情要做。我可以繼續在外面做.ContinueWith
鏈接,如果不是有被執行的一個更火力地堡的任務。理想情況下,我想返回代表整個事情Task
但他們嵌套。火力地堡的方法來啓動它自己的任務,所以我想我只能看不能捆綁我自己所有的任務。
我試圖封裝所有的任務作爲一個新的任務從Task.Factory.StartNew
開始但是「GetComponent只能從主線程調用」是一個問題。 (該Auth
和其他火力地堡服務將需要GetComponent
)
我嘗試使用IEnumerator
爲Login()
返回,並計劃把yield
這個功能,但是,「產量語句不能匿名方法或lambda表達式中使用」。
我試圖以使loginAfterGetKeyTask
,我從這個函數返回使用loginTask.Wait()
第一ContinueWith
內不IsCompleted
狀態到達,直到它reacehs結束(這將必須等待裏面的任務),但因爲在這種拉姆達ContinueWith
在主線程中,它會導致死鎖。
那麼爲什麼不使用'async/await'? – Nkosi
我已閱讀過關於它們的信息,但不幸的是,Unity的C#版本無法使用這些關鍵字。 – 5argon
噢好吧我不知道。 – Nkosi