首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在统一中将协同工作转化为异步等待方法?

在统一中将协同工作转化为异步等待方法?
EN

Stack Overflow用户
提问于 2022-10-24 14:24:47
回答 2查看 87关注 0票数 -1

假设在联合中,我使用一个web来获得一个JSON响应。我目前使用的函数类似于

代码语言:javascript
复制
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));
    }
}

然后我可以通过

代码语言:javascript
复制
const string prompt = "Albert Einstein was";
StartCoroutine(
    textAI.GetCompletion(prompt, (string result) =>
    {
        Debug.Log(result);
    },
    temperature: 0.5f
));

我将如何重构这个协同工作方法以使用C#的等待和异步方法?

我没有任何特定的最终目标,但可能是因为调用时嵌套较少(当协同线需要另一个路径时,或者当我需要同时等待多个路径时),可能会使事情更容易阅读。谢谢!

EN

回答 2

Stack Overflow用户

发布于 2022-10-25 07:09:18

如果你有时间,团结就是计划使用现代的c#技术。等待/异步在路线图上。

代码语言:javascript
复制
IEnumerator Start() {
    yield return SceneManager.LoadSceneAsync("somescene");
    var task = SomeTaskBasedApi(CancellationToken.None);
    yield return null
}

将会是这样的:

代码语言:javascript
复制
async void Start() {
    var result = await PrepareSceneAndCallAPI();
    await AwaitableCoroutine.NextFrameAsync(CancellationToken);
}

来源:统一与.NET下一步是什么?

票数 1
EN

Stack Overflow用户

发布于 2022-10-25 08:15:51

我不知道是否有更简单的答案,但是可以从Asset中导入免费的UniRx。然后,在某些用于扩展的静态类中,添加

代码语言:javascript
复制
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();
    }
}

现在可以使用以下函数代码:

代码语言:javascript
复制
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;
}

它可以这样被称为

代码语言:javascript
复制
async void Test()
{
    string result = await textAI.GetCompletion_Async("Albert Einstein was");
    Debug.Log("Result:");
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74182594

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档