Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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# Unity中的主线程错误_C#_Multithreading_Unity3d_Webclient - Fatal编程技术网

C# Unity中的主线程错误

C# Unity中的主线程错误,c#,multithreading,unity3d,webclient,C#,Multithreading,Unity3d,Webclient,我正在使用Unity 5.0。 我正在尝试使用C#web客户端异步下载一些文件。 文件被下载,并且DownloadDataCompleted事件也被触发。 然后我试着做一些计算,但我得到了这些错误 RandomRangeInt只能从主线程调用。 加载场景时,将从加载线程执行构造函数和字段初始值设定项。 不要在构造函数或字段初始值设定项中使用此函数,而是将初始化代码移到Awake或Start函数中 以上问题有什么解决方案,或者有人能告诉我如何在主线程上运行该计算部分吗 按要求的代码在这里 priv

我正在使用Unity 5.0。 我正在尝试使用C#web客户端异步下载一些文件。 文件被下载,并且
DownloadDataCompleted
事件也被触发。 然后我试着做一些计算,但我得到了这些错误

RandomRangeInt
只能从主线程调用。 加载场景时,将从加载线程执行构造函数和字段初始值设定项。 不要在构造函数或字段初始值设定项中使用此函数,而是将初始化代码移到Awake或Start函数中

以上问题有什么解决方案,或者有人能告诉我如何在主线程上运行该计算部分吗

按要求的代码在这里

private void DownloadXMLFromServer()
{
    //first download the file from server

WebClient _maClient = new WebClient ();

        _maClient.DownloadDataCompleted += delegate(object sender, DownloadDataCompletedEventArgs e) 
        {
            File.WriteAllBytes("DownloadedXML.xml",e.Result);

                DownloadImgOfApp();
        };

        _maClient.DownloadDataAsync (new Uri (instance.urlOf_XML));

}

public void DownloadImgOfApp()
{

    int appNumber = UnityEngine.Random.Range (0, totalNumbOfAppsAvaialbeInXML);//these line throws error

    string appName = "App" + (appNumber + 1);

    string downloadImgLinkName = null;
    string clickableLink = null;   }

Unity3D中的许多方法可以仅从主线程调用。这意味着只能在
Start()
Update()
Awake()
OnTriggerEnter(…)
等中调用它们。Unity不允许从不同的线程(包括异步回调)调用这些方法

这对于像
GameObject.instatitate(…)
这样的事情是有意义的,但我想不出随机性会导致问题的原因。但出于某种原因,Unity还是阻止了通话

要解决您的问题,您可以创建
System.Random
的实例,并用它生成随机数。

我能看到的唯一问题是这个系统。Random不能给你一个浮点数,只有字节,int或double。

有什么问题?这不是关于“计算”,而是一种无法调用的特定方法。看起来你完全可以解决这个问题,还是?RandomRangeInt听起来几乎不像是一个无法替代的方法。你能给我们看看你的一些代码吗?这会有很大帮助。这也是Unity 5的一个变化。我猜(只是猜测)您正在使用一些
单例
类,在这些类中,方法是从初始值设定项或类似的方法调用的。如果您展示一些代码,那么将更值得欣赏的是将变量声明与变量初始化分开(或从init定义)。让我们说-[第一步]-在myRandom中声明它是公共的;然后在你的空白处开始()-[2步]-给myRandom一个值,作为myRandom=Random.Range(1,5);好的,即使我使用PlayerPrefs.GetFloat(“字符串”)或start例程,它也会给出相同的错误…只能从主线程调用。构造函数和字段初始值设定项将从……执行。Random.Range也在UnityEngine命名空间中。所以统一也不允许随机范围。但是你可以使用System.Range