You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Upgrading from 3.1.7 to 4.0.9, in an app running AvaloniaUI 11.0.10 undesirable new behavior is shown. An ObjectDisposedException is thrown, although apparently caught/ignored/hidden higher up in the call stack, this is still undesirable and constitutes a code smell. Exceptions that can be avoided should be avoided.
Step to reproduce
I don't have a minimum reproduceable sample unfortunately, and the app in question is not open source. Hopefully somebody who knows what has changed and examining the call stack below will recognize the root cause. The change in behavior occurs with no other change than upgrading from 3.1.7 to 4.0.9, and has been re-confirmed by downgrading (no issue) and upgrading again (new behavior is back).
Reproduction repository
No response
Expected behavior
In normal usage, exceptions should not be thrown, and specifically not ObjectDisposedException. Notable also is that it's a changed behavior from 3.1.7 to 4.0.9 .
Full call stack follows:
System.Reactive.dll!System.Reactive.Subjects.ReplaySubject<ReactiveUI.Validation.States.IValidationState>.ReplayBase.CheckDisposed() Line 424 C#
System.Reactive.dll!System.Reactive.Subjects.ReplaySubject<ReactiveUI.Validation.States.IValidationState>.ReplayBase.Subscribe(System.IObserver<ReactiveUI.Validation.States.IValidationState> observer) Line 373 C#
System.Reactive.dll!System.Reactive.Subjects.ReplaySubject<ReactiveUI.Validation.States.IValidationState>.Subscribe(System.IObserver<ReactiveUI.Validation.States.IValidationState> observer) Line 200 C#
System.Reactive.dll!System.ObservableExtensions.SubscribeSafe<ReactiveUI.Validation.States.IValidationState>(System.IObservable<ReactiveUI.Validation.States.IValidationState> source, System.IObserver<ReactiveUI.Validation.States.IValidationState> observer) Line 395 C#
System.Reactive.dll!System.Reactive.Subjects.ConnectableObservable<ReactiveUI.Validation.States.IValidationState, ReactiveUI.Validation.States.IValidationState>.Subscribe(System.IObserver<ReactiveUI.Validation.States.IValidationState> observer) Line 90 C#
System.Reactive.dll!System.ObservableExtensions.SubscribeSafe<ReactiveUI.Validation.States.IValidationState>(System.IObservable<ReactiveUI.Validation.States.IValidationState> source, System.IObserver<ReactiveUI.Validation.States.IValidationState> observer) Line 395 C#
System.Reactive.dll!System.Reactive.Sink<ReactiveUI.Validation.States.IValidationState, ReactiveUI.Validation.Components.Abstractions.IValidationComponent>.Run(System.IObservable<ReactiveUI.Validation.States.IValidationState> source) Line 89 C#
System.Reactive.dll!System.Reactive.Linq.ObservableImpl.Select<ReactiveUI.Validation.States.IValidationState, ReactiveUI.Validation.Components.Abstractions.IValidationComponent>.Selector.Run(System.Reactive.Linq.ObservableImpl.Select<ReactiveUI.Validation.States.IValidationState, ReactiveUI.Validation.Components.Abstractions.IValidationComponent>.Selector._ sink) Line 22 C#
System.Reactive.dll!System.Reactive.Producer<ReactiveUI.Validation.Components.Abstractions.IValidationComponent, System.Reactive.Linq.ObservableImpl.Select<ReactiveUI.Validation.States.IValidationState, ReactiveUI.Validation.Components.Abstractions.IValidationComponent>.Selector._>.SubscribeRaw(System.IObserver<ReactiveUI.Validation.Components.Abstractions.IValidationComponent> observer, bool enableSafeguard) Line 128 C#
System.Reactive.dll!System.ObservableExtensions.SubscribeSafe<ReactiveUI.Validation.Components.Abstractions.IValidationComponent>(System.IObservable<ReactiveUI.Validation.Components.Abstractions.IValidationComponent> source, System.IObserver<ReactiveUI.Validation.Components.Abstractions.IValidationComponent> observer) Line 388 C#
System.Reactive.dll!System.Reactive.Linq.ObservableImpl.Merge<ReactiveUI.Validation.Components.Abstractions.IValidationComponent>.Observables._.OnNext(System.IObservable<ReactiveUI.Validation.Components.Abstractions.IValidationComponent> value) Line 181 C#
System.Reactive.dll!System.Reactive.Sink<System.IObservable<ReactiveUI.Validation.Components.Abstractions.IValidationComponent>>.ForwardOnNext(System.IObservable<ReactiveUI.Validation.Components.Abstractions.IValidationComponent> value) Line 50 C#
System.Reactive.dll!System.Reactive.Linq.ObservableImpl.ToObservableRecursive<System.IObservable<ReactiveUI.Validation.Components.Abstractions.IValidationComponent>>._.LoopRec(System.Reactive.Concurrency.IScheduler scheduler) Line 122 C#
System.Reactive.dll!System.Reactive.Linq.ObservableImpl.ToObservableRecursive<System.IObservable<ReactiveUI.Validation.Components.Abstractions.IValidationComponent>>._.Run.AnonymousMethod__3_0(System.Reactive.Concurrency.IScheduler innerScheduler, System.Reactive.Linq.ObservableImpl.ToObservableRecursive<System.IObservable<ReactiveUI.Validation.Components.Abstractions.IValidationComponent>>._ this) Line 55 C#
System.Reactive.dll!System.Reactive.Concurrency.ImmediateScheduler.Schedule<System.Reactive.Linq.ObservableImpl.ToObservableRecursive<System.IObservable<ReactiveUI.Validation.Components.Abstractions.IValidationComponent>>._>(System.Reactive.Linq.ObservableImpl.ToObservableRecursive<System.IObservable<ReactiveUI.Validation.Components.Abstractions.IValidationComponent>>._ state, System.Func<System.Reactive.Concurrency.IScheduler, System.Reactive.Linq.ObservableImpl.ToObservableRecursive<System.IObservable<ReactiveUI.Validation.Components.Abstractions.IValidationComponent>>._, System.IDisposable> action) Line 41 C#
System.Reactive.dll!System.Reactive.Linq.ObservableImpl.ToObservableRecursive<System.IObservable<ReactiveUI.Validation.Components.Abstractions.IValidationComponent>>._.Run(System.Collections.Generic.IEnumerable<System.IObservable<ReactiveUI.Validation.Components.Abstractions.IValidationComponent>> source, System.Reactive.Concurrency.IScheduler scheduler) Line 56 C#
System.Reactive.dll!System.Reactive.Linq.ObservableImpl.ToObservableRecursive<System.IObservable<ReactiveUI.Validation.Components.Abstractions.IValidationComponent>>.Run(System.Reactive.Linq.ObservableImpl.ToObservableRecursive<System.IObservable<ReactiveUI.Validation.Components.Abstractions.IValidationComponent>>._ sink) Line 24 C#
System.Reactive.dll!System.Reactive.Producer<System.IObservable<ReactiveUI.Validation.Components.Abstractions.IValidationComponent>, System.Reactive.Linq.ObservableImpl.ToObservableRecursive<System.IObservable<ReactiveUI.Validation.Components.Abstractions.IValidationComponent>>._>.SubscribeRaw(System.IObserver<System.IObservable<ReactiveUI.Validation.Components.Abstractions.IValidationComponent>> observer, bool enableSafeguard) Line 128 C#
System.Reactive.dll!System.ObservableExtensions.SubscribeSafe<System.IObservable<ReactiveUI.Validation.Components.Abstractions.IValidationComponent>>(System.IObservable<System.IObservable<ReactiveUI.Validation.Components.Abstractions.IValidationComponent>> source, System.IObserver<System.IObservable<ReactiveUI.Validation.Components.Abstractions.IValidationComponent>> observer) Line 388 C#
System.Reactive.dll!System.Reactive.Sink<System.IObservable<ReactiveUI.Validation.Components.Abstractions.IValidationComponent>, ReactiveUI.Validation.Components.Abstractions.IValidationComponent>.Run(System.IObservable<System.IObservable<ReactiveUI.Validation.Components.Abstractions.IValidationComponent>> source) Line 89 C#
System.Reactive.dll!System.Reactive.Linq.ObservableImpl.Merge<ReactiveUI.Validation.Components.Abstractions.IValidationComponent>.Observables.Run(System.Reactive.Linq.ObservableImpl.Merge<ReactiveUI.Validation.Components.Abstractions.IValidationComponent>.Observables._ sink) Line 163 C#
System.Reactive.dll!System.Reactive.Producer<ReactiveUI.Validation.Components.Abstractions.IValidationComponent, System.Reactive.Linq.ObservableImpl.Merge<ReactiveUI.Validation.Components.Abstractions.IValidationComponent>.Observables._>.SubscribeRaw(System.IObserver<ReactiveUI.Validation.Components.Abstractions.IValidationComponent> observer, bool enableSafeguard) Line 128 C#
System.Reactive.dll!System.ObservableExtensions.SubscribeSafe<ReactiveUI.Validation.Components.Abstractions.IValidationComponent>(System.IObservable<ReactiveUI.Validation.Components.Abstractions.IValidationComponent> source, System.IObserver<ReactiveUI.Validation.Components.Abstractions.IValidationComponent> observer) Line 388 C#
System.Reactive.dll!System.Reactive.TailRecursiveSink<ReactiveUI.Validation.Components.Abstractions.IValidationComponent>.Drain() Line 128 C#
System.Reactive.dll!System.Reactive.TailRecursiveSink<ReactiveUI.Validation.Components.Abstractions.IValidationComponent>.Run(System.Collections.Generic.IEnumerable<System.IObservable<ReactiveUI.Validation.Components.Abstractions.IValidationComponent>> sources) Line 35 C#
System.Reactive.dll!System.Reactive.Linq.ObservableImpl.Concat<ReactiveUI.Validation.Components.Abstractions.IValidationComponent>.Run(System.Reactive.Linq.ObservableImpl.Concat<ReactiveUI.Validation.Components.Abstractions.IValidationComponent>._ sink) Line 20 C#
System.Reactive.dll!System.Reactive.Producer<ReactiveUI.Validation.Components.Abstractions.IValidationComponent, System.Reactive.Linq.ObservableImpl.Concat<ReactiveUI.Validation.Components.Abstractions.IValidationComponent>._>.SubscribeRaw(System.IObserver<ReactiveUI.Validation.Components.Abstractions.IValidationComponent> observer, bool enableSafeguard) Line 128 C#
System.Reactive.dll!System.ObservableExtensions.SubscribeSafe<ReactiveUI.Validation.Components.Abstractions.IValidationComponent>(System.IObservable<ReactiveUI.Validation.Components.Abstractions.IValidationComponent> source, System.IObserver<ReactiveUI.Validation.Components.Abstractions.IValidationComponent> observer) Line 388 C#
System.Reactive.dll!System.Reactive.Linq.ObservableImpl.Switch<ReactiveUI.Validation.Components.Abstractions.IValidationComponent>._.OnNext(System.IObservable<ReactiveUI.Validation.Components.Abstractions.IValidationComponent> value) Line 59 C#
System.Reactive.dll!System.Reactive.Sink<System.IObservable<ReactiveUI.Validation.Components.Abstractions.IValidationComponent>>.ForwardOnNext(System.IObservable<ReactiveUI.Validation.Components.Abstractions.IValidationComponent> value) Line 50 C#
System.Reactive.dll!System.Reactive.Linq.ObservableImpl.Select<System.Collections.Generic.IReadOnlyCollection<ReactiveUI.Validation.Components.Abstractions.IValidationComponent>, System.IObservable<ReactiveUI.Validation.Components.Abstractions.IValidationComponent>>.Selector._.OnNext(System.Collections.Generic.IReadOnlyCollection<ReactiveUI.Validation.Components.Abstractions.IValidationComponent> value) Line 48 C#
System.Reactive.dll!System.Reactive.Sink<System.Collections.Generic.IReadOnlyCollection<ReactiveUI.Validation.Components.Abstractions.IValidationComponent>>.ForwardOnNext(System.Collections.Generic.IReadOnlyCollection<ReactiveUI.Validation.Components.Abstractions.IValidationComponent> value) Line 50 C#
System.Reactive.dll!System.Reactive.Linq.ObservableImpl.Select<System.Collections.Generic.IReadOnlyCollection<ReactiveUI.Validation.Components.Abstractions.IValidationComponent>, System.Collections.Generic.IReadOnlyCollection<ReactiveUI.Validation.Components.Abstractions.IValidationComponent>>.Selector._.OnNext(System.Collections.Generic.IReadOnlyCollection<ReactiveUI.Validation.Components.Abstractions.IValidationComponent> value) Line 48 C#
System.Reactive.dll!System.Reactive.AutoDetachObserver<System.Collections.Generic.IReadOnlyCollection<ReactiveUI.Validation.Components.Abstractions.IValidationComponent>>.OnNextCore(System.Collections.Generic.IReadOnlyCollection<ReactiveUI.Validation.Components.Abstractions.IValidationComponent> value) Line 62 C#
System.Reactive.dll!System.Reactive.ObserverBase<System.Collections.Generic.IReadOnlyCollection<ReactiveUI.Validation.Components.Abstractions.IValidationComponent>>.OnNext(System.Collections.Generic.IReadOnlyCollection<ReactiveUI.Validation.Components.Abstractions.IValidationComponent> value) Line 36 C#
DynamicData.dll!DynamicData.List.Internal.QueryWhenChanged<ReactiveUI.Validation.Components.Abstractions.IValidationComponent>.Run.AnonymousMethod__1(DynamicData.IChangeSet<ReactiveUI.Validation.Components.Abstractions.IValidationComponent> changes) Line 24 C#
System.Reactive.dll!System.Reactive.AnonymousObserver<DynamicData.IChangeSet<ReactiveUI.Validation.Components.Abstractions.IValidationComponent>>.OnNextCore(DynamicData.IChangeSet<ReactiveUI.Validation.Components.Abstractions.IValidationComponent> value) Line 67 C#
System.Reactive.dll!System.Reactive.ObserverBase<DynamicData.IChangeSet<ReactiveUI.Validation.Components.Abstractions.IValidationComponent>>.OnNext(DynamicData.IChangeSet<ReactiveUI.Validation.Components.Abstractions.IValidationComponent> value) Line 36 C#
System.Reactive.dll!System.Reactive.AutoDetachObserver<DynamicData.IChangeSet<ReactiveUI.Validation.Components.Abstractions.IValidationComponent>>.OnNextCore(DynamicData.IChangeSet<ReactiveUI.Validation.Components.Abstractions.IValidationComponent> value) Line 62 C#
System.Reactive.dll!System.Reactive.ObserverBase<DynamicData.IChangeSet<ReactiveUI.Validation.Components.Abstractions.IValidationComponent>>.OnNext(DynamicData.IChangeSet<ReactiveUI.Validation.Components.Abstractions.IValidationComponent> value) Line 36 C#
System.Reactive.dll!System.Reactive.Sink<DynamicData.IChangeSet<ReactiveUI.Validation.Components.Abstractions.IValidationComponent>>.ForwardOnNext(DynamicData.IChangeSet<ReactiveUI.Validation.Components.Abstractions.IValidationComponent> value) Line 50 C#
System.Reactive.dll!System.Reactive.IdentitySink<DynamicData.IChangeSet<ReactiveUI.Validation.Components.Abstractions.IValidationComponent>>.OnNext(DynamicData.IChangeSet<ReactiveUI.Validation.Components.Abstractions.IValidationComponent> value) Line 16 C#
System.Reactive.dll!System.Reactive.Subjects.Subject<DynamicData.IChangeSet<ReactiveUI.Validation.Components.Abstractions.IValidationComponent>>.OnNext(DynamicData.IChangeSet<ReactiveUI.Validation.Components.Abstractions.IValidationComponent> value) Line 149 C#
DynamicData.dll!DynamicData.SourceList<ReactiveUI.Validation.Components.Abstractions.IValidationComponent>.InvokeNext(DynamicData.IChangeSet<ReactiveUI.Validation.Components.Abstractions.IValidationComponent> changes) Line 166 C#
System.Reactive.dll!System.Reactive.AnonymousSafeObserver<DynamicData.IChangeSet<ReactiveUI.Validation.Components.Abstractions.IValidationComponent>>.OnNext(DynamicData.IChangeSet<ReactiveUI.Validation.Components.Abstractions.IValidationComponent> value) Line 44 C#
System.Reactive.dll!System.Reactive.Sink<DynamicData.IChangeSet<ReactiveUI.Validation.Components.Abstractions.IValidationComponent>>.ForwardOnNext(DynamicData.IChangeSet<ReactiveUI.Validation.Components.Abstractions.IValidationComponent> value) Line 50 C#
System.Reactive.dll!System.Reactive.Linq.ObservableImpl.Select<DynamicData.IChangeSet<ReactiveUI.Validation.Components.Abstractions.IValidationComponent>, DynamicData.IChangeSet<ReactiveUI.Validation.Components.Abstractions.IValidationComponent>>.Selector._.OnNext(DynamicData.IChangeSet<ReactiveUI.Validation.Components.Abstractions.IValidationComponent> value) Line 48 C#
System.Reactive.dll!System.Reactive.Sink<DynamicData.IChangeSet<ReactiveUI.Validation.Components.Abstractions.IValidationComponent>>.ForwardOnNext(DynamicData.IChangeSet<ReactiveUI.Validation.Components.Abstractions.IValidationComponent> value) Line 50 C#
System.Reactive.dll!System.Reactive.IdentitySink<DynamicData.IChangeSet<ReactiveUI.Validation.Components.Abstractions.IValidationComponent>>.OnNext(DynamicData.IChangeSet<ReactiveUI.Validation.Components.Abstractions.IValidationComponent> value) Line 16 C#
System.Reactive.dll!System.Reactive.Sink<DynamicData.IChangeSet<ReactiveUI.Validation.Components.Abstractions.IValidationComponent>>.ForwardOnNext(DynamicData.IChangeSet<ReactiveUI.Validation.Components.Abstractions.IValidationComponent> value) Line 50 C#
System.Reactive.dll!System.Reactive.Concurrency.Synchronize<DynamicData.IChangeSet<ReactiveUI.Validation.Components.Abstractions.IValidationComponent>>._.OnNext(DynamicData.IChangeSet<ReactiveUI.Validation.Components.Abstractions.IValidationComponent> value) Line 42 C#
System.Reactive.dll!System.Reactive.Sink<DynamicData.IChangeSet<ReactiveUI.Validation.Components.Abstractions.IValidationComponent>>.ForwardOnNext(DynamicData.IChangeSet<ReactiveUI.Validation.Components.Abstractions.IValidationComponent> value) Line 50 C#
System.Reactive.dll!System.Reactive.ObserveOnObserverNew<DynamicData.IChangeSet<ReactiveUI.Validation.Components.Abstractions.IValidationComponent>>.DrainStep(System.Collections.Concurrent.ConcurrentQueue<DynamicData.IChangeSet<ReactiveUI.Validation.Components.Abstractions.IValidationComponent>> q) Line 562 C#
System.Reactive.dll!System.Reactive.ObserveOnObserverNew<DynamicData.IChangeSet<ReactiveUI.Validation.Components.Abstractions.IValidationComponent>>.DrainShortRunning(System.Reactive.Concurrency.IScheduler recursiveScheduler) Line 509 C#
System.Reactive.dll!System.Reactive.ObserveOnObserverNew<DynamicData.IChangeSet<ReactiveUI.Validation.Components.Abstractions.IValidationComponent>>..cctor.AnonymousMethod__17_0(System.Reactive.Concurrency.IScheduler scheduler, System.Reactive.ObserveOnObserverNew<DynamicData.IChangeSet<ReactiveUI.Validation.Components.Abstractions.IValidationComponent>> self) Line 497 C#
System.Reactive.dll!System.Reactive.Concurrency.ScheduledItem<System.TimeSpan, System.Reactive.ObserveOnObserverNew<DynamicData.IChangeSet<ReactiveUI.Validation.Components.Abstractions.IValidationComponent>>>.InvokeCore() Line 207 C#
System.Reactive.dll!System.Reactive.Concurrency.ScheduledItem<System.TimeSpan>.Invoke() Line 45 C#
System.Reactive.dll!System.Reactive.Concurrency.CurrentThreadScheduler.Trampoline.Run(System.Reactive.Concurrency.SchedulerQueue<System.TimeSpan> queue) Line 151 C#
System.Reactive.dll!System.Reactive.Concurrency.CurrentThreadScheduler.Schedule<(System.Action<(System.Reactive.Producer<System.Reactive.Unit, System.Reactive.Linq.ObservableImpl.Catch<System.Reactive.Unit>._>, System.Reactive.Linq.ObservableImpl.Catch<System.Reactive.Unit>._)>, (System.Reactive.Producer<System.Reactive.Unit, System.Reactive.Linq.ObservableImpl.Catch<System.Reactive.Unit>._>, System.Reactive.Linq.ObservableImpl.Catch<System.Reactive.Unit>._))>((System.Action<(System.Reactive.Producer<System.Reactive.Unit, System.Reactive.Linq.ObservableImpl.Catch<System.Reactive.Unit>._>, System.Reactive.Linq.ObservableImpl.Catch<System.Reactive.Unit>._)>, (System.Reactive.Producer<System.Reactive.Unit, System.Reactive.Linq.ObservableImpl.Catch<System.Reactive.Unit>._>, System.Reactive.Linq.ObservableImpl.Catch<System.Reactive.Unit>._)) state, System.TimeSpan dueTime, System.Func<System.Reactive.Concurrency.IScheduler, (System.Action<(System.Reactive.Producer<System.Reactive.Unit, System.Reactive.Linq.ObservableImpl.Catch<System.Reactive.Unit>._>, System.Reactive.Linq.ObservableImpl.Catch<System.Reactive.Unit>._)>, (System.Reactive.Producer<System.Reactive.Unit, System.Reactive.Linq.ObservableImpl.Catch<System.Reactive.Unit>._>, System.Reactive.Linq.ObservableImpl.Catch<System.Reactive.Unit>._)), System.IDisposable> action) Line 115 C#
System.Reactive.dll!System.Reactive.Concurrency.LocalScheduler.Schedule<(System.Action<(System.Reactive.Producer<System.Reactive.Unit, System.Reactive.Linq.ObservableImpl.Catch<System.Reactive.Unit>._>, System.Reactive.Linq.ObservableImpl.Catch<System.Reactive.Unit>._)>, (System.Reactive.Producer<System.Reactive.Unit, System.Reactive.Linq.ObservableImpl.Catch<System.Reactive.Unit>._>, System.Reactive.Linq.ObservableImpl.Catch<System.Reactive.Unit>._))>((System.Action<(System.Reactive.Producer<System.Reactive.Unit, System.Reactive.Linq.ObservableImpl.Catch<System.Reactive.Unit>._>, System.Reactive.Linq.ObservableImpl.Catch<System.Reactive.Unit>._)>, (System.Reactive.Producer<System.Reactive.Unit, System.Reactive.Linq.ObservableImpl.Catch<System.Reactive.Unit>._>, System.Reactive.Linq.ObservableImpl.Catch<System.Reactive.Unit>._)) state, System.Func<System.Reactive.Concurrency.IScheduler, (System.Action<(System.Reactive.Producer<System.Reactive.Unit, System.Reactive.Linq.ObservableImpl.Catch<System.Reactive.Unit>._>, System.Reactive.Linq.ObservableImpl.Catch<System.Reactive.Unit>._)>, (System.Reactive.Producer<System.Reactive.Unit, System.Reactive.Linq.ObservableImpl.Catch<System.Reactive.Unit>._>, System.Reactive.Linq.ObservableImpl.Catch<System.Reactive.Unit>._)), System.IDisposable> action) Line 32 C#
System.Reactive.dll!System.Reactive.Concurrency.Scheduler.ScheduleAction<(System.Reactive.Producer<System.Reactive.Unit, System.Reactive.Linq.ObservableImpl.Catch<System.Reactive.Unit>._>, System.Reactive.Linq.ObservableImpl.Catch<System.Reactive.Unit>._)>(System.Reactive.Concurrency.IScheduler scheduler, (System.Reactive.Producer<System.Reactive.Unit, System.Reactive.Linq.ObservableImpl.Catch<System.Reactive.Unit>._>, System.Reactive.Linq.ObservableImpl.Catch<System.Reactive.Unit>._) state, System.Action<(System.Reactive.Producer<System.Reactive.Unit, System.Reactive.Linq.ObservableImpl.Catch<System.Reactive.Unit>._>, System.Reactive.Linq.ObservableImpl.Catch<System.Reactive.Unit>._)> action) Line 61 C#
System.Reactive.dll!System.Reactive.Producer<System.Reactive.Unit, System.Reactive.Linq.ObservableImpl.Catch<System.Reactive.Unit>._>.SubscribeRaw(System.IObserver<System.Reactive.Unit> observer, bool enableSafeguard) Line 128 C#
System.Reactive.dll!System.Reactive.Producer<System.Reactive.Unit, System.Reactive.Linq.ObservableImpl.Catch<System.Reactive.Unit>._>.Subscribe(System.IObserver<System.Reactive.Unit> observer) Line 97 C#
System.Reactive.dll!System.ObservableExtensions.Subscribe<System.Reactive.Unit>(System.IObservable<System.Reactive.Unit> source) Line 37 C#
ReactiveUI.dll!ReactiveUI.ReactiveCommandBase<System.Reactive.Unit, System.Reactive.Unit>.ICommandExecute(object parameter) Line 172 C#
ReactiveUI.dll!ReactiveUI.ReactiveCommandBase<System.Reactive.Unit, System.Reactive.Unit>.System.Windows.Input.ICommand.Execute(object parameter) Line 111 C#
Avalonia.Controls.dll!Avalonia.Controls.Button.OnClick() Line 349 C#
Avalonia.Controls.dll!Avalonia.Controls.Button.OnPointerReleased(Avalonia.Input.PointerReleasedEventArgs e) Line 419 C#
Avalonia.Base.dll!Avalonia.Input.InputElement..cctor.AnonymousMethod__32_9(Avalonia.Input.InputElement x, Avalonia.Input.PointerReleasedEventArgs e) Line 225 C#
Avalonia.Base.dll!Avalonia.Interactivity.RoutedEvent<Avalonia.Input.PointerReleasedEventArgs>.AddClassHandler.__Adapter|0(object sender, Avalonia.Interactivity.RoutedEventArgs e) Line 127 C#
Avalonia.Base.dll!Avalonia.Interactivity.RoutedEvent.AddClassHandler.AnonymousMethod__0((object, Avalonia.Interactivity.RoutedEventArgs) args) Line 94 C#
Avalonia.Base.dll!Avalonia.Reactive.AnonymousObserver<(object, Avalonia.Interactivity.RoutedEventArgs)>.OnNext((object, Avalonia.Interactivity.RoutedEventArgs) value) Line 66 C#
Avalonia.Base.dll!Avalonia.Reactive.LightweightObservableBase<(object, Avalonia.Interactivity.RoutedEventArgs)>.PublishNext((object, Avalonia.Interactivity.RoutedEventArgs) value) Line 145 C#
Avalonia.Base.dll!Avalonia.Reactive.LightweightSubject<(object, Avalonia.Interactivity.RoutedEventArgs)>.OnNext((object, Avalonia.Interactivity.RoutedEventArgs) value) Line 25 C#
Avalonia.Base.dll!Avalonia.Interactivity.RoutedEvent.InvokeRaised(object sender, Avalonia.Interactivity.RoutedEventArgs e) Line 100 C#
Avalonia.Base.dll!Avalonia.Interactivity.EventRoute.RaiseEventImpl(Avalonia.Interactivity.RoutedEventArgs e) Line 144 C#
Avalonia.Base.dll!Avalonia.Interactivity.EventRoute.RaiseEvent(Avalonia.Interactivity.Interactive source, Avalonia.Interactivity.RoutedEventArgs e) Line 102 C#
Avalonia.Base.dll!Avalonia.Interactivity.Interactive.RaiseEvent(Avalonia.Interactivity.RoutedEventArgs e) Line 126 C#
Avalonia.Base.dll!Avalonia.Input.MouseDevice.MouseUp(Avalonia.Input.IMouseDevice device, ulong timestamp, Avalonia.Input.IInputRoot root, Avalonia.Point p, Avalonia.Input.PointerPointProperties props, Avalonia.Input.KeyModifiers inputModifiers, Avalonia.Input.IInputElement hitTest) Line 201 C#
Avalonia.Base.dll!Avalonia.Input.MouseDevice.ProcessRawEvent(Avalonia.Input.Raw.RawPointerEventArgs e) Line 90 C#
Avalonia.Base.dll!Avalonia.Input.MouseDevice.ProcessRawEvent(Avalonia.Input.Raw.RawInputEventArgs e) Line 38 C#
Avalonia.Base.dll!Avalonia.Input.InputManager.ProcessInput(Avalonia.Input.Raw.RawInputEventArgs e) Line 36 C#
Avalonia.Controls.dll!Avalonia.Controls.TopLevel.HandleInput(Avalonia.Input.Raw.RawInputEventArgs e) Line 753 C#
Avalonia.Win32.dll!Avalonia.Win32.WindowImpl.AppWndProc(nint hWnd, uint msg, nint wParam, nint lParam) Line 754 C#
Avalonia.Win32.dll!Avalonia.Win32.WindowImpl.WndProc(nint hWnd, uint msg, nint wParam, nint lParam) Line 23 C#
[External Code]
Avalonia.Win32.dll!Avalonia.Win32.Win32DispatcherImpl.RunLoop(System.Threading.CancellationToken cancellationToken) Line 111 C#
Avalonia.Base.dll!Avalonia.Threading.DispatcherFrame.Run(Avalonia.Threading.IControlledDispatcherImpl impl) Line 122 C#
Avalonia.Base.dll!Avalonia.Threading.Dispatcher.PushFrame(Avalonia.Threading.DispatcherFrame frame) Line 53 C#
Avalonia.Base.dll!Avalonia.Threading.Dispatcher.MainLoop(System.Threading.CancellationToken cancellationToken) Line 81 C#
Avalonia.Controls.dll!Avalonia.Controls.ApplicationLifetimes.ClassicDesktopStyleApplicationLifetime.Start(string[] args) Line 131 C#
Avalonia.Controls.dll!Avalonia.ClassicDesktopStyleApplicationLifetimeExtensions.StartWithClassicDesktopLifetime(Avalonia.AppBuilder builder, string[] args, System.Action<Avalonia.Controls.ApplicationLifetimes.IClassicDesktopStyleApplicationLifetime> lifetimeBuilder) Line 258 C#
XecretsEz.dll!Xecrets.Ez.Program.AsyncMain(string[] args) Line 92 C#
XecretsEz.dll!Xecrets.Ez.Program.Main(string[] args) Line 60 C#
Screenshots 🖼️
No response
IDE
Visual Studio 2022
Operating system
Windows
Version
No response
Device
PC
ReactiveUI Version
4.0.9
Additional information ℹ️
No response
The text was updated successfully, but these errors were encountered:
Ok, so here's what seems to have happened. In commit 5d0c812 for issue #652 "Housekeeping Retire Xamarin" ReactiveValidationObject has a breaking change in that it now implements IDisposable . A ViewModel for example inheriting from ReactiveValidationObject after this change needs to ensure that it's actually disposed. Otherwise the above issue occurs. @ChrisPulman - perhaps this should be noted somewhere to clarify?
Describe the bug 🐞
Upgrading from 3.1.7 to 4.0.9, in an app running AvaloniaUI 11.0.10 undesirable new behavior is shown. An ObjectDisposedException is thrown, although apparently caught/ignored/hidden higher up in the call stack, this is still undesirable and constitutes a code smell. Exceptions that can be avoided should be avoided.
Step to reproduce
I don't have a minimum reproduceable sample unfortunately, and the app in question is not open source. Hopefully somebody who knows what has changed and examining the call stack below will recognize the root cause. The change in behavior occurs with no other change than upgrading from 3.1.7 to 4.0.9, and has been re-confirmed by downgrading (no issue) and upgrading again (new behavior is back).
Reproduction repository
No response
Expected behavior
In normal usage, exceptions should not be thrown, and specifically not ObjectDisposedException. Notable also is that it's a changed behavior from 3.1.7 to 4.0.9 .
Full call stack follows:
Screenshots 🖼️
No response
IDE
Visual Studio 2022
Operating system
Windows
Version
No response
Device
PC
ReactiveUI Version
4.0.9
Additional information ℹ️
No response
The text was updated successfully, but these errors were encountered: