Update-Pruefung regelmaessig und ab Werk an, Installation nur auf Klick
CI / Build & Tests (Linux) (push) Canceled after 0s
CI / Plattformneutralität & Hygiene (push) Canceled after 0s

Richards Vorgabe vom 14.09.2026 (#587): Updates nie automatisch installieren,
aber regelmaessig pruefen und darauf hinweisen.

Bisher pruefte der Desktop genau einmal beim Start, das WebUI nur beim
Seitenaufruf, und ab Werk gar nicht (UpdateCheckEnabled=false). Eine
wochenlang laufende oder frisch installierte Anwendung erfuhr nie von einem
neuen Release.

- UpdateCheckEnabled ab Werk true, neu UpdateCheckIntervalHours (6, 1..168)
- UpdateCheckBackgroundService: erste Pruefung nach 30 s, dann im Takt; laeuft
  auch ohne WebUI und kopflos; Hinweis im Log einmal je neuer Fassung
- Registrierung ueber AddPolyTraderUpdateCheck, nicht mehr am WebUI
- Desktop-Banner haengt an UpdateStatusService.Checked; "Spaeter" blendet bis
  zur naechsten neueren Fassung aus
- WebUI-Banner holt alle 10 Minuten den vorgehaltenen Stand

Auf der Linux-VM geprueft: 0.1.9 ohne Handeinstellung erkennt 0.2.0, ein
Hinweis im Log, Banner erscheint, "Spaeter" blendet aus, Beenden in 0,1 s.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Richard
2026-09-14 12:16:33 +02:00
co-authored by Claude Opus 5
parent 14c89aea7d
commit b4d8a2a647
9 changed files with 241 additions and 58 deletions
@@ -52,6 +52,15 @@ namespace PolyTrader.Web.Updates
_utcNow = utcNow ?? (() => DateTime.UtcNow);
}
/// <summary>Letztes Prüfergebnis, <c>null</c> vor der ersten Prüfung.</summary>
public UpdateCheckSnapshot? Last => _last;
/// <summary>
/// Feuert nach jeder frischen Prüfung, nicht bei einer Antwort aus dem Zwischenspeicher. Der Desktop hängt
/// sein Update-Banner daran - geprüft wird an genau einer Stelle, angezeigt an zweien.
/// </summary>
public event Action<UpdateCheckSnapshot>? Checked;
/// <summary>
/// Liefert das Ergebnis, bei Bedarf frisch geprüft. <c>RetryAfter</c> ist gesetzt, wenn eine erzwungene
/// Prüfung zu früh kam und stattdessen der vorige Stand geliefert wird.
@@ -59,6 +68,7 @@ namespace PolyTrader.Web.Updates
public async Task<(UpdateCheckSnapshot Snapshot, bool FromCache, TimeSpan? RetryAfter)> GetAsync(bool force, CancellationToken ct)
{
// Eine Prüfung zur Zeit: Gleichzeitige Aufrufe warten und bekommen danach das frische Ergebnis.
UpdateCheckSnapshot fresh;
await _gate.WaitAsync(ct);
try
{
@@ -72,13 +82,17 @@ namespace PolyTrader.Web.Updates
return (_last, true, MinManualInterval - age);
}
_last = await _checker.CheckAsync(ct);
return (_last, false, null);
fresh = await _checker.CheckAsync(ct);
_last = fresh;
}
finally
{
_gate.Release();
}
// Ausserhalb der Sperre: Ein Empfaenger, der selbst GetAsync ruft, soll sich nicht selbst blockieren.
Checked?.Invoke(fresh);
return (fresh, false, null);
}
}