From c0b14a7ff4fc0c0fc6838486fde3f06a36bb8af0 Mon Sep 17 00:00:00 2001 From: "dependencyupdates[bot]" <218638057+dependencyupdates[bot]@users.noreply.github.com> Date: Wed, 20 May 2026 05:32:38 +0000 Subject: [PATCH 1/2] Update dependency ReactiveUI.WPF to v23 --- src/Directory.Packages.props | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Directory.Packages.props b/src/Directory.Packages.props index 658388dda5..85b68cd3f7 100644 --- a/src/Directory.Packages.props +++ b/src/Directory.Packages.props @@ -70,7 +70,7 @@ - + From e7c0d9b6b1544c36885ed5e048fc88636076b70d Mon Sep 17 00:00:00 2001 From: jasontaylordev Date: Thu, 21 May 2026 10:24:23 +1000 Subject: [PATCH 2/2] Migrate to RxAppBuilder --- src/ServiceControl.Config/AppBootstrapper.cs | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/src/ServiceControl.Config/AppBootstrapper.cs b/src/ServiceControl.Config/AppBootstrapper.cs index 4b8d0d19c6..b3a0554f0a 100644 --- a/src/ServiceControl.Config/AppBootstrapper.cs +++ b/src/ServiceControl.Config/AppBootstrapper.cs @@ -11,6 +11,7 @@ using Caliburn.Micro; using FluentValidation; using ReactiveUI; + using ReactiveUI.Builder; using ServiceControl.Config.Framework; using ServiceControlInstaller.Engine.Validation; using UI.Shell; @@ -41,17 +42,18 @@ protected override void Configure() DisableRxUIDebuggerBreak(); } + // ReactiveUI's default handler calls Debugger.Break() on unhandled reactive exceptions, which pauses at an unhelpful + // internal location. This replaces it so exceptions are re-thrown on the main thread with a useful stack trace instead. void DisableRxUIDebuggerBreak() { - RxApp.DefaultExceptionHandler = Observer.Create(delegate (Exception ex) - { - RxApp.MainThreadScheduler.Schedule(() => + _ = RxAppBuilder.CreateReactiveUIBuilder() + .WithExceptionHandler(Observer.Create(delegate (Exception ex) { - throw new Exception( - "An OnError occurred on an object (usually ObservableAsPropertyHelper) that would break a binding or command. To prevent this, Subscribe to the ThrownExceptions property of your objects", - ex); - }); - }); + _ = RxSchedulers.MainThreadScheduler.Schedule(() => throw new Exception( + "An OnError occurred on an object (usually ObservableAsPropertyHelper) that would break a binding or command. To prevent this, Subscribe to the ThrownExceptions property of your objects", + ex)); + })) + .BuildApp(); } protected override object GetInstance(Type service, string key)