在Viewmodel中,我想跟踪异步调用的状态。假设我在viewmodel中有两个异步调用,我想跟踪所有异步调用何时完成。 我做了如下: 设置为private var以跟踪每个异步调用:
private bool _isDone1 = false;
private bool _isDone2 = false;
设置一个属性,如:
private bool _isDone;
public bool IsDone
{
get { return this._isDone1&&this._isDone2; }
set
{
if (this._isDone != value)
{
this._isDone = value;
if(this._isDone)
{
// done somting here when all async call done
}
this.RaisePropertyChanged("IsDone");
}
}
}
在每个异步调用的已完成事件中,设置代码如: 对于电话1:
_isDone1 = true;
this.RaisePropertyChanged("IsDone");
对于电话2:
_isDone2 = true;
this.RaisePropertyChanged("IsDone");
然后我运行应用程序,似乎IsDone的代码永远不会被触及。 如何解决这个问题或者更好的解决方案?
答案 0 :(得分:2)
您的IsDone
财产设计不合理。二传手与吸气器无关。在某些时候,您的应用可以将IsDone
设置为true,但_isDone1 && _isDone2
评估为false。这可能会导致细微的错误。
在继续之前需要完成所有异步请求时,更好的通用方法是使用批处理加载程序。它将批量处理所有异步请求,并在事件全部完成时触发事件。 Here is a batch loader为RIA服务撰写,但如果您不使用RIA服务,则一般概念仍然适用。
至于为什么你的“IsDone代码永远不会被触及”,很难从你给出的代码片段中说出来。您正在提出正确的属性更改名称,因此您的应用程序中还有其他内容。也许发布更多代码?
在您发布的代码中,您永远不会调用IsDone
setter,因此,只要我们知道setter中用于表示自己的if语句,您就可以继续调用了。