在 Unity 中使用 UniRx 包時,可以使用 async-await。但是轉換如下內容的正確方法是什么(此示例使用 GPT-3 www 請求,但它可以是任何東西)
string result1 = await textAI.GetCompletion("Albeit Einstein was");
string result2 = await textAI.GetCompletion("Susan Sarandon is");
到同時啟動 GetCompletion 函式,然后在所有完成并回傳結果時繼續的東西?例如使用偽代碼,像這樣:
string result1 = null;
string result2 = null;
await Task.WhenAll({
result1 = await textAI.GetCompletion("Albeit Einstein was"),
result2 = await textAI.GetCompletion("Susan Sarandon is")
});
Debug.Log("Results: " result1 ", " result2);
謝謝!
uj5u.com熱心網友回復:
您可以使用現有的 Task.WhenAll
async void Start()
{
Task<string> a = AsyncRoutineA(); // Here no await, you want the Task object
Task<string> b = AsyncRoutineB();
await Task.WhenAll(a, b); // add all tasks and await that one
Debug.Log(a.Result " " b.Result);
}
async Task<string> AsyncRoutineA()
{
await Task.Delay(1000);
return "A Done";
}
async Task<string> AsyncRoutineB()
{
await Task.Delay(2000);
return "B Done";
}
UniRx 也會做同樣的事情,但需要額外的開銷,以便您獲得一個不會在此背景關系中使用的 Observable 物件。
你可以對協程做同樣的事情:
IEnumerator Start()
{
string resultA = null;
string resultB = null;
StartCoroutine(AsyncRoutineA((result) => resultA = result));
StartCoroutine(AsyncRoutineA((result) => resultB = result));
yield return new WaitUntil(()=>
{
return !string.IsNullOrEmpty(resultA) && !string.IsNullOrEmpty(resultB);
});
Debug.Log(resultA " " resultB);
}
IEnumerator AsyncRoutineA(Action<string> result)
{
yield return new WaitForSeconds(1);
result.Invoke("A done");
}
IEnumerator AsyncRoutineB(Action<string> result)
{
yield return new WaitForSeconds(2f);
result.Invoke("B done");
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/519991.html
標籤:C#unity3d
下一篇:Unity2D中的回應式