Каков рекомендуемый способ освобождения пользовательского интерфейса от длительной фоновой задачи на стороне клиента Blazor? - PullRequest
3 голосов
/ 01 апреля 2019

Наше приложение Blazor (на стороне клиента) состоит из множества компонентов, одновременно существующих в пользовательском интерфейсе.Один из них должен выполнить несколько больших вызовов данных в Azure SQL.Этот компонент выполняет эти вызовы независимо от того, имеет ли он фокус пользовательского интерфейса или нет.Каждый из этих вызовов может занять до 3 секунд, чтобы вернуть свой результат, во время которого пользовательский интерфейс перестает отвечать на запросы.Как мы можем поддерживать отзывчивость интерфейса во время этих вызовов, не используя сервер Blazor.Использование Task.Run и т. Д. Не помогает в однопоточной архитектуре.Использование загрузочных блесен также не вариант, так как это по-прежнему оставляет пользовательский интерфейс без ответа и может быть невидимым для пользователя.Есть ли способ достичь этой цели в текущей версии Blazor 0.9.0?

Запуск последней версии предварительного просмотра Blazor (0.9.0-preview3-19154-02)

Ответы [ 2 ]

2 голосов
/ 04 апреля 2019

Вы можете использовать Invoke, я изменил пример страницы counter, чтобы проиллюстрировать это, вам понадобится некий объект DI-синглтон, чтобы избежать запуска процесса дважды.

Помните Blazor - экспериментальный проект. Кроме того, этот ответ также экспериментальный подход.

@page "/counter"

<h1>Counter</h1>

<p>Current count: @currentCount</p>

<button class="btn btn-primary" onclick="@IncrementCount">Click me</button>

@functions {
    int currentCount = 0;

    void IncrementCount()
    {
        currentCount++;
    }

    protected  override void OnInit()
    {
        Invoke(
            //here your task.
            async () =>
            {
                for(var i =0; i< 50; i++)
                {
                    await Task.Delay(1000);
                    currentCount++;
                    StateHasChanged();                    
                    System.Console.WriteLine("Still running ...");
                }
            });
    }
}
1 голос
/ 01 апреля 2019

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...