【问题标题】:Call WWW outside main thread在主线程外调用 WWW
【发布时间】:2014-03-09 17:06:41
【问题描述】:

我正在使用 Parse SDK for Unity 来获取一些文件并保存在我的资源目录中。当我调用 parse.findAsync() 时,它会创建另一个任务,我无法调用 WWW 来下载我从 parse 获得的 URL。我需要:

  • 调用解析
  • 获取解析信息
  • 为我从 parse 获得的每个文件调用 www
  • 等待一切完成;
  • 返回结果;

我试过了:

      public IEnumerator GetXXXAsync(String objectId){
        var query = ParseObject.GetQuery("xxx").WhereEqualTo("yyy", ParseObject.
        CreateWithoutData("zzz", objectId));

        List<String> urlList = new List<String>();
        Album album = null;

        query.FindAsync().ContinueWith(t =>
                                       {
            var tasks = new List<Task>();
            Task task = Task.FromResult(0);
            foreach (var result in t.Result)
            {
                ParseObject obj  = result;      

                ParseFile file = (ParseFile)obj.Get<ParseFile>("image");
                if(file != null){
                    urlList.Add(file.Url.ToString());
                    tasks.Add(GetImageAsync(file.Url.ToString(), "image.png")); 
                }               


            }

            // finished.
            return Task.WhenAll(tasks);
        }).Unwrap().ContinueWith(_ =>
         {
            gameManager.SendOk();

        });

        return null;
      }

      private WWW WaitForImage(String url, string filename) {   

        WWW www = new WWW( url );
        while(!www.isDone){
            Debug.Log("Waiting");
        }
        Utils.SaveFileFromTexture(www.texture, (gameManager.GetResourcesPath() + "/Textures/" + filename));
        Debug.Log("Saving file ");
        return www;     


    }


    public Task<WWW> GetImageAsync(String url, string filename) {
        var task = new TaskCompletionSource<WWW>();
        Debug.Log("GetImageAsync " + filename);
        task.SetResult(WaitForImage(url, filename));
        return task.Task;
    }

我尝试获取 IEnumerator 而不是 WWW,但我总是得到 WWW“无法在主线程外调用”。我有什么办法可以在主线程之外调用 WWW 吗?还是别的什么?

Tks,

【问题讨论】:

  • 没有办法。使用coroutine“异步”运行WWW(与Unity 一样异步)或找到第3 方下载工具。
  • 快速提问。如果下载的资源不是已编译的应用程序资源文件的一部分,您打算如何使用它们?
  • @Alex 您可以在运行时使用 www.LoadImageIntoTexture(texTmp); 加载图像并且可以用于 url 或文件路径。或者对于模型,您可以为运行时创建一个像这样的导入器wiki.unity3d.com/index.php?title=ObjImporter
  • @Shredder2500 +1!你每天都会学到新东西:)

标签: c# unity3d parse-platform


【解决方案1】:

您可以在异步操作完成后使用this 在主线程上运行 WWW。或者您可以使用 system.net 中的 webclient 在后台线程上下载。不要忘记您可以在主线程上使用 WWW 来生成下载,以使其在下载时不会锁定您的帧。

网络客户端示例

WebClient webClient = new WebClient();

webClient.DownloadProgressChanged += OnChange;
webClient.DownloadFileCompleted += OnCompleted;
webClient.DownloadFileAsync(new Uri(download), fileAndPath);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-02-21
    • 2010-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-02
    相关资源
    最近更新 更多