Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 我的API脚本中的协同路由继续失败_C#_Unity3d - Fatal编程技术网

C# 我的API脚本中的协同路由继续失败

C# 我的API脚本中的协同路由继续失败,c#,unity3d,C#,Unity3d,我正在尝试为我的应用程序重新配置一个脚本,使用新版本的Unity3d,似乎start例程需要一个停止功能,但不确定该功能放在哪里 我一直在想如何添加一个if语句来停止协同程序并修复致命错误 我尝试在Start例程之后添加StopAllCorroutines,如下所示: void Start() { StartCoroutine(GetText()); StopAllCoroutines(); } 下面是完整的GET-API脚本: void Start() { Start

我正在尝试为我的应用程序重新配置一个脚本,使用新版本的Unity3d,似乎
start例程
需要一个停止功能,但不确定该功能放在哪里

我一直在想如何添加一个if语句来停止协同程序并修复致命错误

我尝试在Start例程之后添加StopAllCorroutines,如下所示:

void Start()
{
    StartCoroutine(GetText());
    StopAllCoroutines();
}
下面是完整的GET-API脚本:

void Start()
{
    StartCoroutine(GetText());
    StopAllCoroutines();
}

IEnumerator GetText()
{
    UnityWebRequest www = UnityWebRequest.Get(json);
    yield return www.SendWebRequest();

    if (www.isNetworkError || www.isHttpError)
    {
        Debug.Log(www.error);
    }
    else
    {
        // Show results as text
        string myText = www.downloadHandler.text;
        var rate = (double)JToken.Parse(myText).SelectToken("bpi.USD.rate");
        var rate2 = 1 / rate;
        //response  Text.text = rate2.ToString();
        mText = GetComponent<TextMeshPro>();
        mText.text = "BTC: " + rate2.ToString("0.########");
    }
}

private void Update()
{
    Start();
}
void Start()
{
start例程(GetText());
StopAllCoroutines();
}
IEnumerator GetText()
{
UnityWebRequest www=UnityWebRequest.Get(json);
返回www.SendWebRequest();
如果(www.isNetworkError | | www.isHttpError)
{
Debug.Log(www.error);
}
其他的
{
//将结果显示为文本
字符串myText=www.downloadHandler.text;
var rate=(double)JToken.Parse(myText.SelectToken(“bpi.USD.rate”);
var比率2=1/比率;
//response Text.Text=rate2.ToString();
mText=GetComponent();
mText.text=“BTC:+rate2.ToString”(“0;
}
}
私有void更新()
{
Start();
}
致命错误:协同程序继续失败


每帧都要启动一个新的协同路由,这几乎肯定是一个问题(如果没有其他问题,它可能会破坏性能)

您还告诉协同程序在启动后立即停止,因此您肯定永远不会超过协同程序的第一个收益率

通常使用协同路由时,如果您希望在任何时候只运行一个协同路由的活动实例,则应保留Start例程返回的引用,并对该引用调用StopCorroutine,如下所示:

Coroutine Routine = null;

void Example()
{
    if (Routine != null)
    {
        StopCoroutine(Routine);
    }
    Routine = StartCoroutine(ExampleCoroutine());
}

IEnumerator ExampleCoroutine()
{
    // do coroutine

    // end coroutine with:
    Routine = null;
}

确保调用StopCorroutine的MonoBehavior与调用StartRoutine的MonoBehavior相同。不这样做可能是您提到的错误的最常见原因。

为什么在启动协同程序后立即停止它?您正在每
更新一帧启动/停止协同路由,我认为您不希望这样。我想不出任何其他方法来修复Unity中的协同路由继续错误。当我在播放模式下运行应用程序时,即使在我停止播放模式后,协同程序仍会继续运行。我添加了您提供的代码,并做了一些更改。现在,当我在播放模式下运行时,我收到了这个错误:还有什么我可以做的吗?-你在每一帧抛出一个NotImplementedException(如果在场景中的启用对象上,则在每一帧调用MonoBehavior的更新方法)。-例如,协同程序实际上并不像您编写的那样是一个协同程序。协同程序应该是返回IEnumerator而不是属性的方法。-从未调用GetText()。你不想在某个时候运行协同程序吗Example()似乎也没有在任何地方被调用至于抛出NullReferenceException的是什么,它似乎与该文件没有任何关系。