Files
elwig/Elwig/Windows/ContextWindow.cs

59 lines
1.7 KiB
C#

using Elwig.Helpers;
using System;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Threading;
namespace Elwig.Windows {
public abstract class ContextWindow : Window {
public static readonly int RenewSec = 10;
protected AppDbContext Context { get; private set; }
protected bool LockContext { get; set; } = false;
private readonly DispatcherTimer _timer;
private bool _renewPending = false;
public ContextWindow() : base() {
_timer = new DispatcherTimer();
_timer.Tick += new EventHandler(OnShouldRenewContext);
_timer.Interval = new TimeSpan(0, 0, RenewSec);
_timer.Start();
Context = new();
Loaded += OnLoaded;
}
public async Task HintContextChange() {
_renewPending = true;
if (LockContext) return;
await RenewContext();
}
private async void OnShouldRenewContext(object? sender, EventArgs? evt) {
if (!Context.HasBackendChanged) return;
await HintContextChange();
}
protected async void OnLoaded(object? sender, RoutedEventArgs? evt) {
await OnRenewContext();
}
protected override void OnClosed(EventArgs evt) {
base.OnClosed(evt);
Context.Dispose();
}
protected async Task RenewContext() {
if (!_renewPending) return;
var old = Context;
Context = new();
await OnRenewContext();
_renewPending = false;
old.Dispose();
}
abstract protected Task OnRenewContext();
}
}