Nano Hash - криптовалюты, майнинг, программирование

Индикатор выполнения пользовательского интерфейса не обновляется до тех пор, пока не будет вызван асинхронный метод

Я пытаюсь отобразить простой индикатор выполнения во время загрузки службы. Я не могу на всю жизнь понять, почему это не выполняется немедленно.

Вид:

<ProgressBar x:Name="ProgressBar" 
    IsIndeterminate="True" 
    Visibility="{Binding IsLoading, Mode=OneWay, Converter={StaticResource BoolToVisiblityConverter}}"   />

Просмотр модели:

private Boolean _isLoading;
public Boolean IsLoading
    {
        get { return _isLoading; }
        set
        {
            Set(ref _isLoading, value);
        }
    }

public SignInViewModel(INavigationService navigationService)
    {
        IsLoading = false;
        _navigationService = navigationService;
        Username = "";
        SignInCommand = new RelayCommand( SignIn, CanSignIn);
    }

private async void SignIn()
    {

  //    DispatcherHelper.CheckBeginInvokeOnUI(() =>
  //       {
               IsLoading = true;
               RaisePropertyChanged("IsLoading");
   //      });

        var response = await OrchestratorContext.Instance.SignInWithPassword(_username, _password);

        if (response.IsSuccessful)
        {
            //     _navigationService.NavigateTo("LandingPage");
        }
    }

Индикатор выполнения не начинает загружаться до тех пор, пока функция входа не будет завершена. Я пробовал использовать диспетчер, а также пытался поднять свойство, измененное после установки. Какие-либо предложения?


  • Можете ли вы опубликовать код для OrchestratorContext.Instance.SignInWithPassword? Проблема может быть там. 31.07.2015

Ответы:


1

Я не уверен, что это лучший подход, но я заработал, создав новый поток. Есть ли лучший подход?

private void SignIn()
    {
        IsLoading = true;

        Task.Factory.StartNew(async () =>
        {
            var response = await OrchestratorContext.Instance.SignInWithPassword(_username, _password);

            if (response.IsSuccessful)
            {
                DispatcherHelper.CheckBeginInvokeOnUI(() =>
                    {
                        _navigationService.NavigateTo("LandingPage");
                    });
            }
        });
    }
30.07.2015
  • Используйте Task.Run вместо Task.Factory.StartNew с async-await. 31.07.2015
  • Если это работает, это означает, что SignInWithPassword работал в потоке пользовательского интерфейса, блокируя любые обновления пользовательского интерфейса. Отображает ли этот метод какой-либо пользовательский интерфейс? Пожалуйста, опубликуйте соответствующий код. Кстати, RaisePropertyChanged должен вызываться установщиком свойства, а не кодом, который устанавливает свойство 31.07.2015
  • @Panagiotis, это именно то поведение, которое он демонстрировал. Я ошибался, думая, что await/async всегда запускается в новом потоке (таким образом, он будет вне потока пользовательского интерфейса). Проведя еще несколько исследований, похоже, что это не так, и это может породить, а может и не породить новый. 31.07.2015

  • 2

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

    Однако каждая асинхронная функция должна возвращать либо Task (если она обычно возвращает void), либо Task<TResult>, если она обычно возвращает TResult.

    Есть одно исключение: обработчик события может возвращать void вместо Task, однако обработчик события все равно должен быть объявлен асинхронным.

    Если вы будете следовать этим правилам, ваш пользовательский интерфейс останется отзывчивым, а индикатор выполнения продолжит обновляться:

    private async void Button1_clicked(object sender, ...)
    {
        await Signin();
    }
    
    private async Task SignIn()
    {
        // do some processing
        var response = await OrchestratorContext...
        // do some more processing
    }
    

    Обратите внимание на возвращаемое Task значение Signin()

    Теперь во время ожидания пользовательский интерфейс остается отзывчивым.

    04.08.2015
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..