Ein herzliches Moin in die Runde :-)
Ich stehe gerade vor einem etwas kleineren Problem, nehme ich mal an.
Aber ich fange vorne an...
Ich habe ein kleines Tool, mit dem ich Services unseres ERP auf den ApplicationServern stoppen, starten und neu starten kann.
Wir haben aktuell 4 ApplicationServer, weshalb das schon mal eine kleine Erleichterung ist.
Ich habe das über Tasks gelöst, die Methode zum Starten der Services sieht aktuell so aus:
Das Problem taucht im Catch-Block in dem Task auf:
Ich kann logischer Weise nicht auf die UI Controls zugreifen, geschweige denn neue Child-Elemente zufügen, was hier im Grunde ja passiert.
Das Problem ist wie die meisten schon erkannt haben, dass der Task nicht im STAThread läuft.
Jetzt habe ich im Netz haufenweise Lösungen gefunden, die sich aber alle auf Threads beziehen.
Ich hatte das anfangs auch mal mit Thread umgesetzt, kam aber nie genau auf das Verhalten, was ich jetzt mit Task erreicht habe. Daher würde ich das ungerne wieder auf Thread umbauen müssen.
Meine Frage
Kann ich aus meinem Task heraus irgendwie die UI triggern?
Danke für Meinungen und Hilfe!
Ich stehe gerade vor einem etwas kleineren Problem, nehme ich mal an.
Aber ich fange vorne an...
Ich habe ein kleines Tool, mit dem ich Services unseres ERP auf den ApplicationServern stoppen, starten und neu starten kann.
Wir haben aktuell 4 ApplicationServer, weshalb das schon mal eine kleine Erleichterung ist.
Ich habe das über Tasks gelöst, die Methode zum Starten der Services sieht aktuell so aus:
Code:
private async Task StartService() { foreach (var server in CommonDataModel.ApplicationServers) { lbxStatus.Items.Add(string.Empty); CommonDataModel.ApplicationServersControls[server.Key].Background = Brushes.Orange; var ServicesList = server.Value ? CommonDataModel.ExtendedServices : CommonDataModel.DefaultServices; foreach (var service in ServicesList.Reverse()) { lbxStatus.Items.Add(GetListBoxItem($"starting {service.Key} on {server.Key}", Brushes.Orange)); await Task.Run(() => { try { using (ServiceController sc = new ServiceController(service.Key, server.Key)) { if (!sc.Status.Equals(ServiceControllerStatus.StartPending) || !sc.Status.Equals(ServiceControllerStatus.Running)) sc.Start(); sc.WaitForStatus(ServiceControllerStatus.Running); } } catch (Exception ex) { lbxStatus.Items.Add(ex.Message); } }); lbxStatus.Items.Add(GetListBoxItem($"{service.Key} on {server.Key} is running", Brushes.Green)); } CommonDataModel.ApplicationServersControls[server.Key].Background = Brushes.LightGreen; } }
Code:
await Task.Run(() => { try { using (ServiceController sc = new ServiceController(service.Key, server.Key)) { if (!sc.Status.Equals(ServiceControllerStatus.StartPending) || !sc.Status.Equals(ServiceControllerStatus.Running)) sc.Start(); sc.WaitForStatus(ServiceControllerStatus.Running); } } catch (Exception ex) { lbxStatus.Items.Add(ex.Message); } });
Das Problem ist wie die meisten schon erkannt haben, dass der Task nicht im STAThread läuft.
Jetzt habe ich im Netz haufenweise Lösungen gefunden, die sich aber alle auf Threads beziehen.
Ich hatte das anfangs auch mal mit Thread umgesetzt, kam aber nie genau auf das Verhalten, was ich jetzt mit Task erreicht habe. Daher würde ich das ungerne wieder auf Thread umbauen müssen.
Meine Frage
Kann ich aus meinem Task heraus irgendwie die UI triggern?
Danke für Meinungen und Hilfe!
Comment