From 849751a419fd4ed3f504891ecb82504116af515c Mon Sep 17 00:00:00 2001
From: Lorenz Stechauner <lorenz.stechauner@necronda.net>
Date: Sun, 13 Oct 2024 21:16:42 +0200
Subject: [PATCH] [#57] DeliveryAdminWindow: Use Task.Run()

---
 Elwig/Services/DeliveryService.cs         | 251 ++++++++++++----------
 Elwig/Windows/DeliveryAdminWindow.xaml.cs |  14 +-
 2 files changed, 147 insertions(+), 118 deletions(-)

diff --git a/Elwig/Services/DeliveryService.cs b/Elwig/Services/DeliveryService.cs
index 1425314..5edcc1e 100644
--- a/Elwig/Services/DeliveryService.cs
+++ b/Elwig/Services/DeliveryService.cs
@@ -430,9 +430,10 @@ namespace Elwig.Services {
         }
 
         public static async Task<DeliveryPart> UpdateDeliveryPart(this DeliveryAdminViewModel vm, int? oldYear, int? oldDid, int? oldDpnr, bool dateHasChanged, bool timeHasChanged, bool timeIsDefault) {
-            DeliveryPart p;
+            var p = await Task.Run(async () => {
+                DeliveryPart p;
 
-            using (var ctx = new AppDbContext()) {
+                using var ctx = new AppDbContext();
                 int year = oldYear ?? Utils.CurrentYear;
                 int did = oldDid ?? await ctx.NextDId(year);
                 int dpnr = oldDpnr ?? await ctx.NextDPNr(year, did);
@@ -524,7 +525,9 @@ namespace Elwig.Services {
                 }
 
                 await ctx.SaveChangesAsync();
-            }
+
+                return p;
+            });
 
             App.HintContextChange();
 
@@ -532,9 +535,10 @@ namespace Elwig.Services {
         }
 
         public static async Task<Delivery> SplitDeliveryToMember(int year, int did, int[] weights, int mgnr) {
-            Delivery n;
+            var n = await Task.Run(async () => {
+                Delivery n;
 
-            using (var ctx = new AppDbContext()) {
+                using var ctx = new AppDbContext();
                 bool anyLeft = false;
                 var d = (await ctx.Deliveries.FindAsync(year, did))!;
                 var lnr = await ctx.NextLNr(d.Date, d.ZwstId);
@@ -577,7 +581,9 @@ namespace Elwig.Services {
                 await ctx.SaveChangesAsync();
                 if (!anyLeft)
                     await ctx.Database.ExecuteSqlAsync($"DELETE FROM delivery WHERE (year, did) = ({d.Year}, {d.DId})");
-            }
+
+                return n;
+            });
 
             App.HintContextChange();
 
@@ -585,9 +591,9 @@ namespace Elwig.Services {
         }
 
         public static async Task<Delivery> SplitDeliveryToLsNr(int year, int did, int[] weights, string lsnr) {
-            Delivery n;
-
-            using (var ctx = new AppDbContext()) {
+            var n = await Task.Run(async () => {
+                Delivery n;
+                using var ctx = new AppDbContext();
                 var anyLeft = false;
                 n = (await ctx.Deliveries.FirstAsync(d => d.LsNr == lsnr))!;
                 var d = (await ctx.Deliveries.FindAsync(year, did))!;
@@ -616,7 +622,9 @@ namespace Elwig.Services {
                 await ctx.SaveChangesAsync();
                 if (!anyLeft && n.LsNr != d.LsNr)
                     await ctx.Database.ExecuteSqlAsync($"DELETE FROM delivery WHERE (year, did) = ({d.Year}, {d.DId})");
-            }
+
+                return n;
+            });
 
             App.HintContextChange();
 
@@ -624,7 +632,8 @@ namespace Elwig.Services {
         }
 
         public static async Task DepreciateDelivery(int year, int did, int[] weights) {
-            using (var ctx = new AppDbContext()) {
+            await Task.Run(async () => {
+                using var ctx = new AppDbContext();
                 var d = (await ctx.Deliveries.FindAsync(year, did))!;
                 var dpnr = await ctx.NextDPNr(year, did);
                 foreach (var (p, w) in d.Parts.ToList().Zip(weights)) {
@@ -648,21 +657,23 @@ namespace Elwig.Services {
                     }
                 }
                 await ctx.SaveChangesAsync();
-            }
+            });
 
             App.HintContextChange();
         }
 
         public static async Task GenerateDeliveryNote(int year, int did, ExportMode mode) {
-            Mouse.OverrideCursor = Cursors.AppStarting;
-            try {
-                using var ctx = new AppDbContext();
-                var d = (await ctx.Deliveries.FindAsync(year, did))!;
-                using var doc = new DeliveryNote(d, ctx);
-                await Utils.ExportDocument(doc, mode, d.LsNr, (d.Member, $"{DeliveryNote.Name} Nr. {d.LsNr}", $"Im Anhang finden Sie den {DeliveryNote.Name} Nr. {d.LsNr}"));
-            } catch (Exception exc) {
-                MessageBox.Show(exc.Message, "Fehler", MessageBoxButton.OK, MessageBoxImage.Error);
-            }
+            Mouse.OverrideCursor = Cursors.Wait;
+            await Task.Run(async () => {
+                try {
+                    using var ctx = new AppDbContext();
+                    var d = (await ctx.Deliveries.FindAsync(year, did))!;
+                    using var doc = new DeliveryNote(d, ctx);
+                    await Utils.ExportDocument(doc, mode, d.LsNr, (d.Member, $"{DeliveryNote.Name} Nr. {d.LsNr}", $"Im Anhang finden Sie den {DeliveryNote.Name} Nr. {d.LsNr}"));
+                } catch (Exception exc) {
+                    MessageBox.Show(exc.Message, "Fehler", MessageBoxButton.OK, MessageBoxImage.Error);
+                }
+            });
             Mouse.OverrideCursor = null;
         }
 
@@ -707,14 +718,16 @@ namespace Elwig.Services {
                     Title = $"{DeliveryJournal.Name} speichern unter - Elwig"
                 };
                 if (d.ShowDialog() == true) {
-                    Mouse.OverrideCursor = Cursors.AppStarting;
-                    try {
-                        var data = await DeliveryJournalData.FromQuery(query, filterNames);
-                        using var ods = new OdsFile(d.FileName);
-                        await ods.AddTable(data);
-                    } catch (Exception exc) {
-                        MessageBox.Show(exc.Message, "Fehler", MessageBoxButton.OK, MessageBoxImage.Error);
-                    }
+                    Mouse.OverrideCursor = Cursors.Wait;
+                    await Task.Run(async () => {
+                        try {
+                            var data = await DeliveryJournalData.FromQuery(query, filterNames);
+                            using var ods = new OdsFile(d.FileName);
+                            await ods.AddTable(data);
+                        } catch (Exception exc) {
+                            MessageBox.Show(exc.Message, "Fehler", MessageBoxButton.OK, MessageBoxImage.Error);
+                        }
+                    });
                     Mouse.OverrideCursor = null;
                 }
             } else if (mode == ExportMode.Export) {
@@ -725,58 +738,64 @@ namespace Elwig.Services {
                     Title = $"{DeliveryJournal.Name} speichern unter - Elwig"
                 };
                 if (d.ShowDialog() == true) {
-                    Mouse.OverrideCursor = Cursors.AppStarting;
+                    Mouse.OverrideCursor = Cursors.Wait;
+                    await Task.Run(async () => {
+                        try {
+                            await ElwigData.Export(d.FileName, await query
+                                .Select(p => p.Delivery)
+                                .Distinct()
+                                .Include(d => d.Parts)
+                                .ThenInclude(p => p.PartModifiers)
+                                .AsSplitQuery()
+                                .ToListAsync(), filterNames);
+                        } catch (Exception exc) {
+                            MessageBox.Show(exc.Message, "Fehler", MessageBoxButton.OK, MessageBoxImage.Error);
+                        }
+                    });
+                    Mouse.OverrideCursor = null;
+                }
+            } else if (mode == ExportMode.Upload && App.Config.SyncUrl != null) {
+                Mouse.OverrideCursor = Cursors.Wait;
+                await Task.Run(async () => {
                     try {
-                        await ElwigData.Export(d.FileName, await query
+                        var filename = $"{DateTime.Now:yyyy-MM-dd_HH-mm-ss}_{App.ZwstId}.elwig.zip";
+                        var path = Path.Combine(App.TempPath, filename);
+                        var list = await query
                             .Select(p => p.Delivery)
                             .Distinct()
                             .Include(d => d.Parts)
                             .ThenInclude(p => p.PartModifiers)
                             .AsSplitQuery()
-                            .ToListAsync(), filterNames);
+                            .ToListAsync();
+                        if (list.Count == 0) {
+                            MessageBox.Show("Es wurden keine Lieferungen zum Hochladen ausgewählt!", "Lieferungen hochladen",
+                                MessageBoxButton.OK, MessageBoxImage.Error);
+                        } else {
+                            await ElwigData.Export(path, list, filterNames);
+                            await Utils.UploadExportData(path, App.Config.SyncUrl, App.Config.SyncUsername, App.Config.SyncPassword);
+                            MessageBox.Show($"Hochladen von {list.Count:N0} Lieferungen erfolgreich!", "Lieferungen hochgeladen",
+                                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, "Fehler", MessageBoxButton.OK, MessageBoxImage.Error);
                     }
-                    Mouse.OverrideCursor = null;
-                }
-            } else if (mode == ExportMode.Upload && App.Config.SyncUrl != null) {
-                Mouse.OverrideCursor = Cursors.AppStarting;
-                try {
-                    var filename = $"{DateTime.Now:yyyy-MM-dd_HH-mm-ss}_{App.ZwstId}.elwig.zip";
-                    var path = Path.Combine(App.TempPath, filename);
-                    var list = await query
-                        .Select(p => p.Delivery)
-                        .Distinct()
-                        .Include(d => d.Parts)
-                        .ThenInclude(p => p.PartModifiers)
-                        .AsSplitQuery()
-                        .ToListAsync();
-                    if (list.Count == 0) {
-                        MessageBox.Show("Es wurden keine Lieferungen zum Hochladen ausgewählt!", "Lieferungen hochladen",
-                            MessageBoxButton.OK, MessageBoxImage.Error);
-                    } else {
-                        await ElwigData.Export(path, list, filterNames);
-                        await Utils.UploadExportData(path, App.Config.SyncUrl, App.Config.SyncUsername, App.Config.SyncPassword);
-                        MessageBox.Show($"Hochladen von {list.Count:N0} Lieferungen erfolgreich!", "Lieferungen hochgeladen",
-                            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, "Fehler", MessageBoxButton.OK, MessageBoxImage.Error);
-                }
+                });
                 Mouse.OverrideCursor = null;
             } else {
-                Mouse.OverrideCursor = Cursors.AppStarting;
-                try {
-                    var data = await DeliveryJournalData.FromQuery(query, filterNames);
-                    using var doc = new DeliveryJournal(string.Join(" / ", filterNames), data);
-                    await Utils.ExportDocument(doc, mode);
-                } catch (Exception exc) {
-                    MessageBox.Show(exc.Message, "Fehler", MessageBoxButton.OK, MessageBoxImage.Error);
-                }
+                Mouse.OverrideCursor = Cursors.Wait;
+                await Task.Run(async () => {
+                    try {
+                        var data = await DeliveryJournalData.FromQuery(query, filterNames);
+                        using var doc = new DeliveryJournal(string.Join(" / ", filterNames), data);
+                        await Utils.ExportDocument(doc, mode);
+                    } catch (Exception exc) {
+                        MessageBox.Show(exc.Message, "Fehler", MessageBoxButton.OK, MessageBoxImage.Error);
+                    }
+                });
                 Mouse.OverrideCursor = null;
             }
         }
@@ -798,14 +817,16 @@ namespace Elwig.Services {
                 throw new ArgumentException("Invalid value for ExportSubject");
             }
 
-            Mouse.OverrideCursor = Cursors.AppStarting;
-            try {
-                var data = await WineQualityStatisticsData.FromQuery(query, App.Client.OrderingMemberList);
-                using var doc = new WineQualityStatistics(string.Join(" / ", filterNames), data);
-                await Utils.ExportDocument(doc, mode);
-            } catch (Exception exc) {
-                MessageBox.Show(exc.Message, "Fehler", MessageBoxButton.OK, MessageBoxImage.Error);
-            }
+            Mouse.OverrideCursor = Cursors.Wait;
+            await Task.Run(async () => {
+                try {
+                    var data = await WineQualityStatisticsData.FromQuery(query, App.Client.OrderingMemberList);
+                    using var doc = new WineQualityStatistics(string.Join(" / ", filterNames), data);
+                    await Utils.ExportDocument(doc, mode);
+                } catch (Exception exc) {
+                    MessageBox.Show(exc.Message, "Fehler", MessageBoxButton.OK, MessageBoxImage.Error);
+                }
+            });
             Mouse.OverrideCursor = null;
         }
 
@@ -829,14 +850,16 @@ namespace Elwig.Services {
                 Title = $"Lieferstatistik pro Ort speichern unter - Elwig"
             };
             if (d.ShowDialog() == true) {
-                Mouse.OverrideCursor = Cursors.AppStarting;
-                try {
-                    using var ods = new OdsFile(d.FileName);
-                    var tbl = await WineLocalityStatisticsData.FromQuery(query, filterNames);
-                    await ods.AddTable(tbl);
-                } catch (Exception exc) {
-                    MessageBox.Show(exc.Message, "Fehler", MessageBoxButton.OK, MessageBoxImage.Error);
-                }
+                Mouse.OverrideCursor = Cursors.Wait;
+                await Task.Run(async () => {
+                    try {
+                        using var ods = new OdsFile(d.FileName);
+                        var tbl = await WineLocalityStatisticsData.FromQuery(query, filterNames);
+                        await ods.AddTable(tbl);
+                    } catch (Exception exc) {
+                        MessageBox.Show(exc.Message, "Fehler", MessageBoxButton.OK, MessageBoxImage.Error);
+                    }
+                });
                 Mouse.OverrideCursor = null;
             }
         }
@@ -875,33 +898,37 @@ namespace Elwig.Services {
                     Title = $"{DeliveryDepreciationList.Name} speichern unter - Elwig"
                 };
                 if (d.ShowDialog() == true) {
-                    Mouse.OverrideCursor = Cursors.AppStarting;
-                    try {
-                        using var ods = new OdsFile(d.FileName);
-                        var tblTotal = await DeliveryJournalData.FromQuery(query, filterNames);
-                        tblTotal.FullName = DeliveryDepreciationList.Name;
-                        tblTotal.Name = "Gesamt";
-                        await ods.AddTable(tblTotal);
-                        foreach (var branch in await ctx.Branches.OrderBy(b => b.Name).ToListAsync()) {
-                            var tbl = await DeliveryJournalData.FromQuery(query.Where(p => p.Delivery.ZwstId == branch.ZwstId), filterNames);
-                            tbl.FullName = DeliveryDepreciationList.Name;
-                            tbl.Name = branch.Name;
-                            await ods.AddTable(tbl);
+                    Mouse.OverrideCursor = Cursors.Wait;
+                    await Task.Run(async () => {
+                        try {
+                            using var ods = new OdsFile(d.FileName);
+                            var tblTotal = await DeliveryJournalData.FromQuery(query, filterNames);
+                            tblTotal.FullName = DeliveryDepreciationList.Name;
+                            tblTotal.Name = "Gesamt";
+                            await ods.AddTable(tblTotal);
+                            foreach (var branch in await ctx.Branches.OrderBy(b => b.Name).ToListAsync()) {
+                                var tbl = await DeliveryJournalData.FromQuery(query.Where(p => p.Delivery.ZwstId == branch.ZwstId), filterNames);
+                                tbl.FullName = DeliveryDepreciationList.Name;
+                                tbl.Name = branch.Name;
+                                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;
                 }
             } else {
-                Mouse.OverrideCursor = Cursors.AppStarting;
-                try {
-                    var data = await DeliveryJournalData.FromQuery(query, filterNames);
-                    using var doc = new DeliveryDepreciationList(string.Join(" / ", filterNames), data);
-                    await Utils.ExportDocument(doc, mode);
-                } catch (Exception exc) {
-                    MessageBox.Show(exc.Message, "Fehler", MessageBoxButton.OK, MessageBoxImage.Error);
-                }
+                Mouse.OverrideCursor = Cursors.Wait;
+                await Task.Run(async () => {
+                    try {
+                        var data = await DeliveryJournalData.FromQuery(query, filterNames);
+                        using var doc = new DeliveryDepreciationList(string.Join(" / ", filterNames), data);
+                        await Utils.ExportDocument(doc, mode);
+                    } catch (Exception exc) {
+                        MessageBox.Show(exc.Message, "Fehler", MessageBoxButton.OK, MessageBoxImage.Error);
+                    }
+                });
                 Mouse.OverrideCursor = null;
             }
         }
@@ -1070,10 +1097,12 @@ namespace Elwig.Services {
         }
 
         public static async Task DeleteDelivery(string lsnr) {
-            using (var ctx = new AppDbContext()) {
+            await Task.Run(async () => {
+                using var ctx = new AppDbContext();
                 await ctx.Deliveries.Where(d => d.LsNr == lsnr).ExecuteDeleteAsync();
                 await ctx.SaveChangesAsync();
-            }
+            });
+
             App.HintContextChange();
         }
     }
diff --git a/Elwig/Windows/DeliveryAdminWindow.xaml.cs b/Elwig/Windows/DeliveryAdminWindow.xaml.cs
index 67464d4..688b8a0 100644
--- a/Elwig/Windows/DeliveryAdminWindow.xaml.cs
+++ b/Elwig/Windows/DeliveryAdminWindow.xaml.cs
@@ -715,7 +715,7 @@ namespace Elwig.Windows {
         private async void NewDeliveryPartButton_Click(object sender, RoutedEventArgs evt) {
             FinishButton.IsEnabled = false;
             NewDeliveryPartButton.IsEnabled = false;
-            Mouse.OverrideCursor = Cursors.AppStarting;
+            Mouse.OverrideCursor = Cursors.Wait;
             DeliveryPartList.IsEnabled = false;
 
             DeliveryPart? p;
@@ -753,7 +753,7 @@ namespace Elwig.Windows {
         private async void FinishButton_Click(object sender, RoutedEventArgs evt) {
             FinishButton.IsEnabled = false;
             NewDeliveryPartButton.IsEnabled = false;
-            Mouse.OverrideCursor = Cursors.AppStarting;
+            Mouse.OverrideCursor = Cursors.Wait;
             DeliveryPartList.IsEnabled = false;
 
             DeliveryPart? p;
@@ -884,7 +884,7 @@ namespace Elwig.Windows {
             if (res == null)
                 return;
 
-            Mouse.OverrideCursor = Cursors.AppStarting;
+            Mouse.OverrideCursor = Cursors.Wait;
             try {
                 var id = res.Value.Item1;
                 var weights = res.Value.Item2;
@@ -955,7 +955,7 @@ namespace Elwig.Windows {
                 $"Soll die Lieferung {d.LsNr} ({d.Member.AdministrativeName}, MgNr. {d.Member.MgNr}) wirklich unwiderruflich gelöscht werden?",
                 "Lieferung löschen", MessageBoxButton.OKCancel, MessageBoxImage.Warning, MessageBoxResult.Cancel);
             if (r == MessageBoxResult.OK) {
-                Mouse.OverrideCursor = Cursors.AppStarting;
+                Mouse.OverrideCursor = Cursors.Wait;
                 try {
                     await DeliveryService.DeleteDelivery(d.LsNr);
                 } catch (Exception exc) {
@@ -975,7 +975,7 @@ namespace Elwig.Windows {
 
         private async void SaveButton_Click(object? sender, RoutedEventArgs? evt) {
             SaveButton.IsEnabled = false;
-            Mouse.OverrideCursor = Cursors.AppStarting;
+            Mouse.OverrideCursor = Cursors.Wait;
 
             DeliveryPart? p;
             try {
@@ -992,9 +992,8 @@ namespace Elwig.Windows {
                 if (exc.InnerException != null) str += "\n\n" + exc.InnerException.Message;
                 MessageBox.Show(str, "Lieferung aktualisieren", MessageBoxButton.OK, MessageBoxImage.Error);
                 SaveButton.IsEnabled = true;
-                return;
-            } finally {
                 Mouse.OverrideCursor = null;
+                return;
             }
 
             IsEditing = false;
@@ -1011,6 +1010,7 @@ namespace Elwig.Windows {
             await RefreshDeliveryParts();
             RefreshInputs();
 
+            Mouse.OverrideCursor = null;
             DepreciateButton.IsEnabled = true;
         }