我有一个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之前都为假。

我想知道是否有更好的方法可以做到这一点。

最佳答案

如果您有两个布尔值_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也具有类似的属性。

10-06 08:16