UI进度条在调用异步方法之前不会更新

时间:2015-07-30 18:51:28

标签: progress-bar async-await mvvm-light

我试图在服务加载时显示一个简单的进度条。我无法解释为什么这不能立即执行。

查看:

<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");
        }
    }

进度条直到登录功能完成后才开始加载。我尝试过使用调度程序,并尝试在设置后更改属性。有什么建议吗?

2 个答案:

答案 0 :(得分: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");
                    });
            }
        });
    }

答案 1 :(得分:0)

你正确地注意,如果你想在你的函数中使用await,那么这个函数应该声明为异步。

但是,每个异步函数都应返回Task(如果它通常会返回void)或Task <TResult&gt;如果它通常会返回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
}

请注意Signin()的任务返回值

现在,在等待用户界面保持响应状态时。