如何在HoloLens应用程序的后台运行进程?

问题描述 投票:0回答:1

目前,我的代码可以从Hololens的本地内存加载并呈现obj文件。但是,在此过程中,应用程序被完全挂起,这可能需要长达几秒钟的时间,具体取决于网格的大小和复杂性。由于可能会怀疑应用程序在此期间崩溃,因此我想将渲染移至后台进程并使主线程保持活动状态。

当前行为:

在加载和呈现obj文件时,应用程序被暂停了几秒钟。

期望的行为:

[网格的加载和渲染是在后台过程中计算的,并且该应用程序保持活动状态。

代码段:

public class FileExplorer: MonoBehaviour {
    private FileOpenPicker openPicker;

    public void OpenExplorer() {
        UnityEngine.WSA.Application.InvokeOnUIThread(() = >OpenFileAsync(), false);
        LoadModelFromFile();
    }

    private async void OpenFileAsync() {
        openPicker = new FileOpenPicker();
        openPicker.SuggestedStartLocation = PickerLocationId.PicturesLibrary;
        openPicker.FileTypeFilter.Add(".obj");

        StorageFile file = await openPicker.PickSingleFileAsync();
        if (file != null) {
            path = file.Path;
        }
    }

    public void LoadModelFromFile() {
        Mesh newMesh = Instantiate(GetComponent < ObjFileLoader > ().LoadModel(path)) as Mesh;
    }
}

注意:

  • 我已经删除了我认为不必要的所有内容,如果有一些问题,我可以将其添加到现有代码中
  • LoadModel(path)返回网格
  • 我试图使其类似于异步OpenFileAsync函数,但这仅导致了几个错误
  • 我已经阅读过有关异步(Async and Await; Don't Block on Async Code,但不太了解的内容]
  • 也许有人可以提示我,我应该await应该是什么值

如果有人遇到类似的问题,可以帮助我解决这个问题或给我提示,我将非常感激。

c# asynchronous uwp async-await hololens
1个回答
0
投票

我认为您正在寻找的是这样的东西。

public async Task OpenExplorer() {
    UnityEngine.WSA.Application.InvokeOnUIThread(async() => await OpenFileAsync(), false);
    await Task.Run(LoadModelFromFile);
}

不过,我的建议是阅读有关Async和Await的更多信息,因为根据您的情况,以上代码可能不遵循最佳实践,并且可能很危险。

最主要的是Async and Await是关于多线程代码的not。异步和等待是关于更有效地使用单个线程。代码,IO和CPU有两个主要瓶颈,异步等待与IO瓶颈配合得很好,因为在等待磁盘操作或等待Web请求时,它可以释放线程以在其他事情上工作(这是不消耗任何线程)。

如果使方法异步,但使它异步的唯一方法是将许多长时间运行的代码启动到另一个线程上,除非您要释放的线程是UI,否则它没有什么用处线程,但是您唯一可以确定的唯一方法就是您是否在UI线程上。

因此,仅当需要释放UI线程时,才从UI上下文中执行await Task.Run...类操作。在其他任何地方,只有将方法纯粹是与IO相关的异步方法(例如File.ReadAsync或其他不消耗任何额外线程的方法)标记为异步方法。

© www.soinside.com 2019 - 2024. All rights reserved.