Beenden haengt nicht mehr, Update-Agent startet erst nach Bestaetigung
CI / Build & Tests (Linux) (push) Canceled after 0s
CI / Plattformneutralität & Hygiene (push) Canceled after 0s

Beim Updatetest auf der Linux-VM (14.09.2026) zeigte sich zweierlei:

1. Nach "Beenden" blieb der Prozess unbegrenzt stehen - Fenster offen, Port zu,
   Main-Thread in host.StopAsync(...).GetResult(), selbst SIGTERM ohne Wirkung.
   Betraf jedes Beenden der Oberflaeche, nicht nur den Update-Weg. Der Main-Thread
   traegt nach StartWithClassicDesktopLifetime noch Avalonias SynchronizationContext,
   dessen Dispatcher nicht mehr pumpt. Der Stopp laeuft jetzt per Task.Run ohne
   diesen Kontext, mit Obergrenze 45 s und Log der Dauer.

2. Der update-agent startete schon beim Klick auf "Installieren". Seine 40 s
   Wartefrist verstrichen waehrend Download und 10-Sekunden-Sperre, er brach ohne
   Update ab. Er startet jetzt erst nach bestaetigtem Beenden, Frist 120 s.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Richard
2026-09-14 11:52:06 +02:00
co-authored by Claude Opus 5
parent 0f18f562c7
commit 14c89aea7d
3 changed files with 39 additions and 7 deletions
@@ -269,7 +269,12 @@ namespace PolyTrader.App.Avalonia.Views
try { licenseKey = SecretProtection.Unprotect(settings?.LicenseKey ?? string.Empty); }
catch { /* siehe CheckForUpdateAsync */ }
UpdateClient.LaunchUpdateAgent(
// Derselbe Weg wie ein Klick auf "Beenden" - inklusive Sicherheitsabfrage. Der Agent startet
// aber erst NACH deren Bestätigung: Am 14.09.2026 lief er schon beim Klick auf "Installieren"
// los, seine 40 s Wartefrist verstrichen während Download und 10-Sekunden-Sperre, und er
// brach ohne Update ab. 120 s decken das Herunterfahren ab (Dienste bis 45 s, siehe
// Program.Main); läuft die Anwendung danach noch, verändert der Agent nichts.
Func<bool> launchAgent = () => UpdateClient.LaunchUpdateAgent(
agentPath: agentPath,
projectId: dcOptions.ProjectSlug,
channel: dcOptions.Channel,
@@ -278,12 +283,13 @@ namespace PolyTrader.App.Avalonia.Views
currentVersion: BuildInfo.Version,
exitCurrentApp: false,
waitForCurrentProcess: true,
waitTimeoutSeconds: 40,
waitTimeoutSeconds: 120,
licenseKey: licenseKey);
// Derselbe Weg wie ein Klick auf "Beenden" - inklusive Sicherheitsabfrage. Der Agent
// wartet ohnehin per --wait-for-pid auf unser Prozessende.
_uiHost.RequestShutdown();
if (_uiHost is AvaloniaUiHost shell)
shell.RequestShutdown(onConfirmed: launchAgent);
else if (launchAgent())
_uiHost.RequestShutdown();
}
// ===== Account-Übersicht =====