reactiveui / ReactiveUI.Validation

Validation helpers for ReactiveUI-based apps.
https://reactiveui.net/docs/handbook/user-input-validation
MIT License
238 stars 26 forks source link

[Bug]: ObjectDisposedException thrown #665

Open xecrets opened 5 months ago

xecrets commented 5 months ago

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:

    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

xecrets commented 2 months ago

Ping? Anyone here?

xecrets commented 2 weeks ago

Ok, so here's what seems to have happened. In commit https://github.com/reactiveui/ReactiveUI.Validation/commit/5d0c8121e62c26745332695439a54651c1fd09f1 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?