假设在联合中,我使用一个web来获得一个JSON响应。我目前使用的函数类似于
public IEnumerator GetCompletion(string prompt, System.Action<string> callback, float temperature = 0.8f)
{
UnityWebRequest www = UnityWebRequest.Post("https://api.openai.com/v1/completions", "");
// ... snip ....
yield return www.SendWebRequest();
if (www.result == UnityWebRequest.Result.ConnectionError)
{
Debug.Log(www.error);
www.Dispose();
yield return null;
}
else
{
www.Dispose();
callback?.Invoke(GetResultFromJson(www.downloadHandler.text));
}
}然后我可以通过
const string prompt = "Albert Einstein was";
StartCoroutine(
textAI.GetCompletion(prompt, (string result) =>
{
Debug.Log(result);
},
temperature: 0.5f
));我将如何重构这个协同工作方法以使用C#的等待和异步方法?
我没有任何特定的最终目标,但可能是因为调用时嵌套较少(当协同线需要另一个路径时,或者当我需要同时等待多个路径时),可能会使事情更容易阅读。谢谢!
发布于 2022-10-25 07:09:18
如果你有时间,团结就是计划使用现代的c#技术。等待/异步在路线图上。
IEnumerator Start() {
yield return SceneManager.LoadSceneAsync("somescene");
var task = SomeTaskBasedApi(CancellationToken.None);
yield return null
}将会是这样的:
async void Start() {
var result = await PrepareSceneAndCallAPI();
await AwaitableCoroutine.NextFrameAsync(CancellationToken);
}发布于 2022-10-25 08:15:51
我不知道是否有更简单的答案,但是可以从Asset中导入免费的UniRx。然后,在某些用于扩展的静态类中,添加
using UnityEngine;
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using System.Runtime.CompilerServices;
public static class Extensions
{
public static TaskAwaiter GetAwaiter(this AsyncOperation asyncOp)
{
var tcs = new TaskCompletionSource<object>();
asyncOp.completed += obj => { tcs.SetResult(null); };
return ((Task)tcs.Task).GetAwaiter();
}
}现在可以使用以下函数代码:
using System.Threading.Tasks;
// ... snip ...
public async Task<string> GetCompletion(string prompt, float temperature = 0.8f)
{
UnityWebRequest www = UnityWebRequest.Post("https://api.openai.com/v1/completions", "");
// ... snip ...
await www.SendWebRequest();
if (www.result == UnityWebRequest.Result.ConnectionError)
{
Debug.Log(www.error);
www.Dispose();
return null;
}
else
{
www.Dispose();
return GetResultFromJson(www.downloadHandler.text);
}
return null;
}它可以这样被称为
async void Test()
{
string result = await textAI.GetCompletion_Async("Albert Einstein was");
Debug.Log("Result:");
}https://stackoverflow.com/questions/74182594
复制相似问题