From a38895035b040b49e1740347f3c58c2d949fbcfa Mon Sep 17 00:00:00 2001 From: Lorenz Stechauner Date: Sun, 13 Oct 2024 21:55:30 +0200 Subject: [PATCH] [#57] MainWindow: Use Task.Run() --- Elwig/Windows/MainWindow.xaml.cs | 297 +++++++++++++++++-------------- 1 file changed, 159 insertions(+), 138 deletions(-) diff --git a/Elwig/Windows/MainWindow.xaml.cs b/Elwig/Windows/MainWindow.xaml.cs index f97c691..5e80bf9 100644 --- a/Elwig/Windows/MainWindow.xaml.cs +++ b/Elwig/Windows/MainWindow.xaml.cs @@ -62,7 +62,7 @@ namespace Elwig.Windows { } private async void Menu_Help_Smtp_Click(object sender, RoutedEventArgs evt) { - Mouse.OverrideCursor = Cursors.AppStarting; + Mouse.OverrideCursor = Cursors.Wait; try { using var client = await Utils.GetSmtpClient(); await client!.DisconnectAsync(true); @@ -133,8 +133,10 @@ namespace Elwig.Windows { Multiselect = true, }; if (d.ShowDialog() == true) { - Mouse.OverrideCursor = Cursors.AppStarting; - await ElwigData.Import(d.FileNames, ElwigData.ImportMode.Interactively); + Mouse.OverrideCursor = Cursors.Wait; + await Task.Run(async () => { + await ElwigData.Import(d.FileNames, ElwigData.ImportMode.Interactively); + }); } } catch (Exception exc) { MessageBox.Show(exc.Message, "Fehler", MessageBoxButton.OK, MessageBoxImage.Error); @@ -145,77 +147,81 @@ namespace Elwig.Windows { private async void DownloadButton_Click(object sender, RoutedEventArgs evt) { if (App.Config.SyncUrl == null) return; - Mouse.OverrideCursor = Cursors.AppStarting; - try { - var data = await Utils.GetExportMetaData(App.Config.SyncUrl, App.Config.SyncUsername, App.Config.SyncPassword); - var files = data - .Select(f => new { - Name = f!["name"]!.AsValue().GetValue(), - Timestamp = f!["timestamp"] != null && DateTime.TryParseExact(f!["timestamp"]!.AsValue().GetValue(), "yyyy-MM-ddTHH:mm:ssK", CultureInfo.InvariantCulture, DateTimeStyles.None, out var dt) ? dt : (DateTime?)null, - ZwstId = f!["meta"]?["zwstid"]?.AsValue().GetValue() ?? f!["zwstid"]?.AsValue().GetValue(), - Device = f!["meta"]?["device"]!.AsValue().GetValue(), - Url = f!["url"]!.AsValue().GetValue(), - Size = f!["size"]!.AsValue().GetValue(), - }) - .Where(f => f.Timestamp >= new DateTime(Utils.CurrentLastSeason, 7, 1)) - .ToList(); + Mouse.OverrideCursor = Cursors.Wait; + await Task.Run(async () => { + try { + var data = await Utils.GetExportMetaData(App.Config.SyncUrl, App.Config.SyncUsername, App.Config.SyncPassword); + var files = data + .Select(f => new { + Name = f!["name"]!.AsValue().GetValue(), + Timestamp = f!["timestamp"] != null && DateTime.TryParseExact(f!["timestamp"]!.AsValue().GetValue(), "yyyy-MM-ddTHH:mm:ssK", CultureInfo.InvariantCulture, DateTimeStyles.None, out var dt) ? dt : (DateTime?)null, + ZwstId = f!["meta"]?["zwstid"]?.AsValue().GetValue() ?? f!["zwstid"]?.AsValue().GetValue(), + Device = f!["meta"]?["device"]!.AsValue().GetValue(), + Url = f!["url"]!.AsValue().GetValue(), + Size = f!["size"]!.AsValue().GetValue(), + }) + .Where(f => f.Timestamp >= new DateTime(Utils.CurrentLastSeason, 7, 1)) + .ToList(); - var imported = await ElwigData.GetImportedFiles(); - var import = files - .Where(f => f.Device != Environment.MachineName && !imported.Contains(f.Name)) - .ToList(); - var paths = new List(); - using (var client = Utils.GetHttpClient(App.Config.SyncUsername, App.Config.SyncPassword)) { - foreach (var f in import) { - var filename = Path.Combine(App.TempPath, f.Name); - using var stream = new FileStream(filename, FileMode.Create); - await client.DownloadAsync(f.Url, stream); - paths.Add(filename); + var imported = await ElwigData.GetImportedFiles(); + var import = files + .Where(f => f.Device != Environment.MachineName && !imported.Contains(f.Name)) + .ToList(); + var paths = new List(); + using (var client = Utils.GetHttpClient(App.Config.SyncUsername, App.Config.SyncPassword)) { + foreach (var f in import) { + var filename = Path.Combine(App.TempPath, f.Name); + using var stream = new FileStream(filename, FileMode.Create); + await client.DownloadAsync(f.Url, stream); + paths.Add(filename); + } } + await ElwigData.Import(paths, ElwigData.ImportMode.FromBranches); + } catch (HttpRequestException exc) { + MessageBox.Show("Eventuell Internetverbindung prüfen!\n\n" + exc.Message, "Fehler", MessageBoxButton.OK, MessageBoxImage.Error); + } catch (TaskCanceledException exc) { + MessageBox.Show("Eventuell Internetverbindung prüfen!\n\n" + exc.Message, "Fehler", MessageBoxButton.OK, MessageBoxImage.Error); + } catch (Exception exc) { + MessageBox.Show(exc.Message, "Fehler", MessageBoxButton.OK, MessageBoxImage.Error); } - await ElwigData.Import(paths, ElwigData.ImportMode.FromBranches); - } catch (HttpRequestException exc) { - MessageBox.Show("Eventuell Internetverbindung prüfen!\n\n" + exc.Message, "Fehler", MessageBoxButton.OK, MessageBoxImage.Error); - } catch (TaskCanceledException exc) { - MessageBox.Show("Eventuell Internetverbindung prüfen!\n\n" + exc.Message, "Fehler", MessageBoxButton.OK, MessageBoxImage.Error); - } catch (Exception exc) { - MessageBox.Show(exc.Message, "Fehler", MessageBoxButton.OK, MessageBoxImage.Error); - } + }); Mouse.OverrideCursor = null; } private async void UploadButton_Click(object sender, RoutedEventArgs evt) { if (App.Config.SyncUrl == null) return; - Mouse.OverrideCursor = Cursors.AppStarting; - try { - var path = Path.Combine(App.TempPath, $"{DateTime.Now:yyyy-MM-dd_HH-mm-ss}_{App.ZwstId}.elwig.zip"); - using var ctx = new AppDbContext(); - var deliveries = await ctx.Deliveries - .Where(d => d.Year == Utils.CurrentLastSeason && d.ZwstId == App.ZwstId) - .Include(d => d.Parts) - .ThenInclude(p => p.PartModifiers) - .OrderBy(d => d.DateString) - .ThenBy(d => d.TimeString) - .ThenBy(d => d.LsNr) - .AsSplitQuery() - .ToListAsync(); - if (deliveries.Count == 0) { - MessageBox.Show("Es gibt keine Lieferungen, die hochgeladen werden können!", "Lieferungen hochladen", - MessageBoxButton.OK, MessageBoxImage.Error); - } else { - await ElwigData.Export(path, deliveries, [$"{Utils.CurrentLastSeason}", $"Zweigstelle {App.BranchName}"]); - await Utils.UploadExportData(path, App.Config.SyncUrl, App.Config.SyncUsername, App.Config.SyncPassword); - MessageBox.Show($"Hochladen von {deliveries.Count:N0} Lieferungen erfolgreich!", "Lieferungen hochladen", - MessageBoxButton.OK, MessageBoxImage.Information); + Mouse.OverrideCursor = Cursors.Wait; + await Task.Run(async () => { + try { + var path = Path.Combine(App.TempPath, $"{DateTime.Now:yyyy-MM-dd_HH-mm-ss}_{App.ZwstId}.elwig.zip"); + using var ctx = new AppDbContext(); + var deliveries = await ctx.Deliveries + .Where(d => d.Year == Utils.CurrentLastSeason && d.ZwstId == App.ZwstId) + .Include(d => d.Parts) + .ThenInclude(p => p.PartModifiers) + .OrderBy(d => d.DateString) + .ThenBy(d => d.TimeString) + .ThenBy(d => d.LsNr) + .AsSplitQuery() + .ToListAsync(); + if (deliveries.Count == 0) { + MessageBox.Show("Es gibt keine Lieferungen, die hochgeladen werden können!", "Lieferungen hochladen", + MessageBoxButton.OK, MessageBoxImage.Error); + } else { + await ElwigData.Export(path, deliveries, [$"{Utils.CurrentLastSeason}", $"Zweigstelle {App.BranchName}"]); + await Utils.UploadExportData(path, App.Config.SyncUrl, App.Config.SyncUsername, App.Config.SyncPassword); + MessageBox.Show($"Hochladen von {deliveries.Count:N0} Lieferungen erfolgreich!", "Lieferungen hochladen", + MessageBoxButton.OK, MessageBoxImage.Information); + } + } catch (HttpRequestException exc) { + MessageBox.Show("Eventuell Internetverbindung prüfen!\n\n" + exc.Message, "Lieferungen hochladen", MessageBoxButton.OK, MessageBoxImage.Error); + } catch (TaskCanceledException exc) { + MessageBox.Show("Eventuell Internetverbindung prüfen!\n\n" + exc.Message, "Fehler", MessageBoxButton.OK, MessageBoxImage.Error); + } catch (Exception exc) { + MessageBox.Show(exc.Message, "Lieferungen hochladen", MessageBoxButton.OK, MessageBoxImage.Error); } - } catch (HttpRequestException exc) { - MessageBox.Show("Eventuell Internetverbindung prüfen!\n\n" + exc.Message, "Lieferungen hochladen", MessageBoxButton.OK, MessageBoxImage.Error); - } catch (TaskCanceledException exc) { - MessageBox.Show("Eventuell Internetverbindung prüfen!\n\n" + exc.Message, "Fehler", MessageBoxButton.OK, MessageBoxImage.Error); - } catch (Exception exc) { - MessageBox.Show(exc.Message, "Lieferungen hochladen", MessageBoxButton.OK, MessageBoxImage.Error); - } + }); Mouse.OverrideCursor = null; } @@ -270,24 +276,31 @@ namespace Elwig.Windows { AreaCommitmentsButton.IsEnabled = valid; BreakdownMemberVarietyButton.IsEnabled = valid; + SeasonStatMembersTotal.Text = "-"; + SeasonStatMembersGeb.Text = "-"; + SeasonStatWeightTotal.Text = "-"; + SeasonStatWeightGeb.Text = "-"; + SeasonStatWeightUngeb.Text = "-"; + SeasonStatArea.Text = "-"; if (valid) { - var areaComs = Utils.ActiveAreaCommitments(ctx.AreaCommitments, year!.Value); - var weightTotal = await ctx.DeliveryParts.Where(p => p.Year == year).SumAsync(p => p.Weight); - var gebWeight = await ctx.DeliveryPartBuckets.Where(b => b.Year == year && b.Discr != "_").SumAsync(b => b.Value); - SeasonStatMembersTotal.Text = $"{await ctx.Deliveries.Where(d => d.Year == year).Select(d => d.Member).Distinct().CountAsync():N0}"; - SeasonStatMembersGeb.Text = $"{await areaComs.Select(c => c.Member).Distinct().CountAsync():N0}"; - SeasonStatWeightTotal.Text = $"{weightTotal:N0} kg"; - SeasonStatWeightGeb.Text = $"{gebWeight:N0} kg"; - SeasonStatWeightUngeb.Text = $"{weightTotal - gebWeight:N0} kg"; - SeasonStatArea.Text = $"{await areaComs.SumAsync(c => c.Area):N0} m²"; - } else { - SeasonStatMembersTotal.Text = "-"; - SeasonStatMembersGeb.Text = "-"; - SeasonStatWeightTotal.Text = "-"; - SeasonStatWeightGeb.Text = "-"; - SeasonStatWeightUngeb.Text = "-"; - SeasonStatArea.Text = "-"; - } + await Task.Run(async () => { + var membersTotal = await ctx.Deliveries.Where(d => d.Year == year).Select(d => d.Member).Distinct().CountAsync(); + var areaComs = Utils.ActiveAreaCommitments(ctx.AreaCommitments, year!.Value); + var membersGeb = await areaComs.Select(c => c.Member).Distinct().CountAsync(); + var weightTotal = await ctx.DeliveryParts.Where(p => p.Year == year).SumAsync(p => p.Weight); + var gebWeight = await ctx.DeliveryPartBuckets.Where(b => b.Year == year && b.Discr != "_").SumAsync(b => b.Value); + var area = await areaComs.SumAsync(c => c.Area); + await App.MainDispatcher.BeginInvoke(() => { + if (year != SeasonInput.Value) return; + SeasonStatMembersTotal.Text = $"{membersTotal:N0}"; + SeasonStatMembersGeb.Text = $"{membersGeb:N0}"; + SeasonStatWeightTotal.Text = $"{weightTotal:N0} kg"; + SeasonStatWeightGeb.Text = $"{gebWeight:N0} kg"; + SeasonStatWeightUngeb.Text = $"{weightTotal - gebWeight:N0} kg"; + SeasonStatArea.Text = $"{area:N0} m²"; + }); + }); + }; } private void DeliveryConfirmationButton_Click(object sender, RoutedEventArgs evt) { @@ -315,22 +328,24 @@ namespace Elwig.Windows { if (d.ShowDialog() == false) return; - Mouse.OverrideCursor = Cursors.AppStarting; - try { - var b = new Billing(year); - await b.FinishSeason(); - await b.CalculateBuckets(); - App.HintContextChange(); + Mouse.OverrideCursor = Cursors.Wait; + await Task.Run(async () => { + try { + var b = new Billing(year); + await b.FinishSeason(); + await b.CalculateBuckets(); + App.HintContextChange(); - using var ctx = new AppDbContext(); - var tbl1 = await OverUnderDeliveryData.ForSeason(ctx.OverUnderDeliveryRows, year); - var tbl2 = await AreaComUnderDeliveryData.ForSeason(ctx.AreaComUnderDeliveryRows, year); - using var ods = new OdsFile(d.FileName); - await ods.AddTable(tbl1); - await ods.AddTable(tbl2); - } catch (Exception exc) { - MessageBox.Show(exc.Message, "Fehler", MessageBoxButton.OK, MessageBoxImage.Error); - } + using var ctx = new AppDbContext(); + var tbl1 = await OverUnderDeliveryData.ForSeason(ctx.OverUnderDeliveryRows, year); + var tbl2 = await AreaComUnderDeliveryData.ForSeason(ctx.AreaComUnderDeliveryRows, year); + using var ods = new OdsFile(d.FileName); + await ods.AddTable(tbl1); + await ods.AddTable(tbl2); + } catch (Exception exc) { + MessageBox.Show(exc.Message, "Fehler", MessageBoxButton.OK, MessageBoxImage.Error); + } + }); Mouse.OverrideCursor = null; } @@ -346,24 +361,26 @@ namespace Elwig.Windows { if (d.ShowDialog() == false) return; - Mouse.OverrideCursor = Cursors.AppStarting; - try { - var b = new Billing(year); - await b.FinishSeason(); - await b.CalculateBuckets(); - App.HintContextChange(); + Mouse.OverrideCursor = Cursors.Wait; + await Task.Run(async () => { + try { + var b = new Billing(year); + await b.FinishSeason(); + await b.CalculateBuckets(); + App.HintContextChange(); - using var ctx = new AppDbContext(); - using var ods = new OdsFile(d.FileName); - var tblTotal = await WeightBreakdownData.ForSeason(ctx.WeightBreakDownRows, year); - await ods.AddTable(tblTotal); - foreach (var branch in await ctx.Branches.OrderBy(b => b.Name).ToListAsync()) { - var tbl = await WeightBreakdownData.ForSeason(ctx.WeightBreakDownRows, year, branch); - await ods.AddTable(tbl); + using var ctx = new AppDbContext(); + using var ods = new OdsFile(d.FileName); + var tblTotal = await WeightBreakdownData.ForSeason(ctx.WeightBreakDownRows, year); + await ods.AddTable(tblTotal); + foreach (var branch in await ctx.Branches.OrderBy(b => b.Name).ToListAsync()) { + var tbl = await WeightBreakdownData.ForSeason(ctx.WeightBreakDownRows, year, branch); + await ods.AddTable(tbl); + } + } catch (Exception exc) { + MessageBox.Show(exc.Message, "Fehler", MessageBoxButton.OK, MessageBoxImage.Error); } - } catch (Exception exc) { - MessageBox.Show(exc.Message, "Fehler", MessageBoxButton.OK, MessageBoxImage.Error); - } + }); Mouse.OverrideCursor = null; } @@ -379,20 +396,22 @@ namespace Elwig.Windows { if (d.ShowDialog() == false) return; - Mouse.OverrideCursor = Cursors.AppStarting; - try { - var b = new Billing(year); - await b.FinishSeason(); - await b.CalculateBuckets(); - App.HintContextChange(); + Mouse.OverrideCursor = Cursors.Wait; + await Task.Run(async () => { + try { + var b = new Billing(year); + await b.FinishSeason(); + await b.CalculateBuckets(); + App.HintContextChange(); - using var ctx = new AppDbContext(); - var tbl = await MemberAreaComsData.ForSeason(ctx.MemberAreaComsRows, year); - using var ods = new OdsFile(d.FileName); - await ods.AddTable(tbl); - } catch (Exception exc) { - MessageBox.Show(exc.Message, "Fehler", MessageBoxButton.OK, MessageBoxImage.Error); - } + using var ctx = new AppDbContext(); + var tbl = await MemberAreaComsData.ForSeason(ctx.MemberAreaComsRows, year); + using var ods = new OdsFile(d.FileName); + await ods.AddTable(tbl); + } catch (Exception exc) { + MessageBox.Show(exc.Message, "Fehler", MessageBoxButton.OK, MessageBoxImage.Error); + } + }); Mouse.OverrideCursor = null; } @@ -408,20 +427,22 @@ namespace Elwig.Windows { if (d.ShowDialog() == false) return; - Mouse.OverrideCursor = Cursors.AppStarting; - try { - var b = new Billing(year); - await b.FinishSeason(); - await b.CalculateBuckets(); - App.HintContextChange(); + Mouse.OverrideCursor = Cursors.Wait; + await Task.Run(async () => { + try { + var b = new Billing(year); + await b.FinishSeason(); + await b.CalculateBuckets(); + App.HintContextChange(); - using var ctx = new AppDbContext(); - var tbl = await MemberDeliveryPerVarietyData.ForSeason(ctx.MemberDeliveryPerVariantRows, year); - using var ods = new OdsFile(d.FileName); - await ods.AddTable(tbl); - } catch (Exception exc) { - MessageBox.Show(exc.Message, "Fehler", MessageBoxButton.OK, MessageBoxImage.Error); - } + using var ctx = new AppDbContext(); + var tbl = await MemberDeliveryPerVarietyData.ForSeason(ctx.MemberDeliveryPerVariantRows, year); + using var ods = new OdsFile(d.FileName); + await ods.AddTable(tbl); + } catch (Exception exc) { + MessageBox.Show(exc.Message, "Fehler", MessageBoxButton.OK, MessageBoxImage.Error); + } + }); Mouse.OverrideCursor = null; } }