Untis-API Optimierung.
This commit is contained in:
@@ -100,11 +100,12 @@ public class App : Application
|
||||
|
||||
private static void DisposeServices()
|
||||
{
|
||||
if (_serviceProvider is null) return;
|
||||
var serviceProvider = Interlocked.Exchange(ref _serviceProvider, null);
|
||||
if (serviceProvider is null) return;
|
||||
|
||||
try
|
||||
{
|
||||
_serviceProvider.GetService<LiteDbContext>()?.Checkpoint();
|
||||
serviceProvider.GetService<LiteDbContext>()?.Checkpoint();
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
@@ -112,18 +113,19 @@ public class App : Application
|
||||
}
|
||||
finally
|
||||
{
|
||||
// Der direkte WebUntis-Client meldet seine Sitzung asynchron ab. Ein synchrones
|
||||
// ServiceProvider.Dispose() lehnt reine IAsyncDisposable-Dienste ab und ließ die App
|
||||
// beim Schließen mit InvalidOperationException abstürzen.
|
||||
// Der Exit-Handler läuft synchron auf dem Avalonia-UI-Thread. Die asynchrone
|
||||
// Entsorgung darf dort nicht mit GetResult() gestartet werden: Fortsetzungen aus
|
||||
// WebUntis/HttpClient könnten sonst auf den blockierten UI-Kontext zurückwarten.
|
||||
try
|
||||
{
|
||||
_serviceProvider.DisposeAsync().AsTask().GetAwaiter().GetResult();
|
||||
Task.Run(async () =>
|
||||
await serviceProvider.DisposeAsync().ConfigureAwait(false))
|
||||
.GetAwaiter().GetResult();
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
AppBootstrapper.Logger.Error("Dienste konnten beim Beenden nicht vollständig freigegeben werden.", ex);
|
||||
}
|
||||
_serviceProvider = null;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user