MvvmCross: NullReferenceException in MvxPathSourceStep.ClearPathSourceBinding
I’ve stumbled upon an interesting crash today. The crash occured in ClearPathSourceBinding. This is the first time it crashes, in 3 months usage of the app.
private void ClearPathSourceBinding()
{
if (this._sourceBinding != null)
{
this._sourceBinding.Changed -= this.SourceBindingOnChanged;
this._sourceBinding.Dispose();
this._sourceBinding = null;
}
}
So the only way this can crash, is because it is executed twice in 2 concurrent tasks. The stacktrace was:
MvxPathSourceStep.OnDataContextChanged
MvxSourceStep.DataContext (setter)
MvxFullBinding.DataContext (setter)
MvxTaskBasedBindingContext.OnDataContextChange
Task.Execute (no information from where it has been created)
This information is not enough to find the root cause of this problem: i don’t know which binding is concerned.
In OnDataContextChange, the DataContext setter is not called from a Task. It is called directly from the DataContext setter. But inside OnDataContextChange are called DataContext setters from bindings. This should mean it is called from inside the Task of OnDataContextChange.
This means a lock should be added around the code inside MvxPathSourceStep.OnDataContextChanged
private object syncLock = new object();
protected override void OnDataContextChanged()
{
lock(syncLock) {
this.ClearPathSourceBinding();
this._sourceBinding = this.SourceBindingFactory.CreateBinding(this.DataContext, this.Description.SourcePropertyPath);
if (this._sourceBinding != null)
{
this._sourceBinding.Changed += this.SourceBindingOnChanged;
}
}
base.OnDataContextChanged();
}
About this issue
- Original URL
- State: closed
- Created 8 years ago
- Comments: 18 (12 by maintainers)
I think it was this one: https://github.com/MvvmCross/MvvmCross/pull/1442