Как запустить процесс в фоновом режиме приложения HoloLens? - PullRequest
0 голосов
/ 27 апреля 2020

В настоящее время мой код может загружать и отображать файл obj из локальной памяти hololens. Однако во время этого процесса приложение полностью приостанавливается, и это может занять до нескольких секунд в зависимости от размера и сложности me sh. Так как можно заподозрить, что в это время произошел сбой приложения, я хочу переместить рендеринг в фоновый процесс и сохранить основной поток активным.

Текущее поведение:

Во время загрузки и рендеринга объекта -файл приложение приостановлено на несколько секунд.

Желаемое поведение:

Загрузка и рендеринг me sh рассчитывается в фоновом режиме, и приложение остается активным.

Фрагмент кода:

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) возвращает Me sh
  • Я пытался сделать его похожим на функцию asyn c OpenFileAsyn c, но это привело только к нескольким ошибкам
  • Я читал об Asyn c ( Asyn c и Await ; Не блокировать на Asyn c Код , но не совсем понимаю
  • Может быть, кто-то может намекнуть мне, какую ценность я должен await

Если бы у кого-то была похожая проблема, и она могла бы помочь мне решить ее или могла бы дать подсказку, я был бы очень благодарен.

1 Ответ

0 голосов
/ 27 апреля 2020

Я думаю, что вы ищете что-то вроде этого.

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

Тем не менее, я предлагаю вам прочитать больше об Asyn c и Await, потому что в зависимости от вашей ситуации, выше код может не соответствовать передовым методам и может быть опасным.

Главное, что Asyn c и Await не для многопоточного кода. Asyn c и Await предполагают более эффективное использование одного потока. В коде есть два основных узких места, IO и CPU, и asyn c await хорошо работает с узкими местами IO, поскольку может освободить потоки для работы с другими вещами, пока вы ожидаете операции на диске или ожидаете веб-запроса. (которые не потребляют никаких потоков).

Если вы создаете метод asyn c, но единственное, что вы делаете, чтобы сделать его асин c, это запуск большого количества долго выполняющегося кода на другой поток, это не так полезно, если только поток, который вы освобождаете, не является потоком пользовательского интерфейса, но единственный способ убедиться в этом наверняка, если вы находитесь в потоке пользовательского интерфейса.

Итак, выполняйте только await Task.Run... вещи из контекста пользовательского интерфейса, когда вам нужно освободить поток пользовательского интерфейса. Везде, только помечайте методы как asyn c, если они связаны только с IO asyn c, как File.ReadAsync или другие, которые не потребляют никаких дополнительных потоков.

...