c# - 多个异步调用的忙碌指示器

标签 c# silverlight windows-phone

我有一个 Busy 属性,该属性在进行异步调用之前设置为 true,然后在完成时设置为 false。现在我有 2 个异步调用,我该如何处理这个逻辑?我是否需要锁定变量或需要注意的其他一些并行问题?

private bool _busy;

public bool Busy
{
    get { return _busy; }
    set
    {
        bool changed = value != _busy;
        _busy = value;
        if (changed) RaisePropertyChanged("Busy");
    }
}

private void loadUser(int userId)
{
        Busy = true;
        api.GetUser(userId, CancellationToken.None).ContinueWith(t =>
                                      Deployment.Current.Dispatcher.BeginInvoke(() =>
                                      {
                                          Busy = false;
                                      }));

}

private void loadOtherData(int dataId)
{
        Busy = true;
        api.GetData(dataId, CancellationToken.None).ContinueWith(t =>
                                      Deployment.Current.Dispatcher.BeginInvoke(() =>
                                      {
                                          Busy = false;
                                      }));

}

我知道这个逻辑是有缺陷的,因为第一个完成执行的方法的 Busy 属性设置为 false。我的一个想法是使用另外 2 个字段; isUserLoadingisOtherDataLoading 并确保在将 Busy 设置为 false 之前两者都为 false。

我想知道是否有更好的方法来实现这一点。

最佳答案

如果您在加载方法中更新了两个 bool 值,_isUserLoading_isOtherDataLoading,那么您只需将 Busy 更改为此:

public bool busy
{
    get
    {
         return _isUserLoading || _isOtherDataLoading;
    }
}

包含对 RaisePropertyChanged 调用的另一个版本可以像这样工作:

public bool busy
{
    get
    {
         return _isUserLoading || _isOtherDataLoading;
    }
}

public bool IsUserLoading
{
    get
    {
         return _isUserLoading;
    }
    set
    {
       bool busy = Busy;
       _isUserLoading = value;
       if (busy != Busy) RaisePropertyChanged("Busy");
    }
}

当然还有 IsOtherDataLoading 的类似属性。

关于c# - 多个异步调用的忙碌指示器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16409372/

相关文章:

c# - 作为 XAML 元素的附加属性

c# - 如何使用 ExpressionMediaPlayer 控件在 Silverlight 中从 Web 服务器流式传输视频?

mvvm - Caliburn Micro 和跨应用程序共享 View 模型

c++ - GestureRecognizer 在 WP Direct3D App 中抛出异常

database - Windows 手机 7 : MVVMLight and Messenger

c# - 如何在没有\/Date的情况下格式化JSON日期?

c# - 双向绑定(bind)设置问题

c# - 在 Application Insight .Net Core 2.1 中使用自定义属性记录用户名和 IP

c# - 重写方法(返回类型 DBDataReader)并返回不同类型(SQLDBDataReader)

c# - 创建一个数组或列表来计算值