Update-Pruefung regelmaessig und ab Werk an, Installation nur auf Klick
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:
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user