none
[UWP] - App mit Frage zu Task.Factory.StartNew, TaskScheduler, ContinueWith... RRS feed

  • Frage

  • Hallo,

    ich habe eine UWP, welche eine Art Logbuch ist. Die Daten werden in einer XML- Datei gespeichert.

    Da der Speichervorgang auf meinem (etwas älteren) Tablet eine Weile dauert, soll dieser Vorgang im Hintergrund laufen, ohne auf ihn zu warten.

    Zur Signalisierung habe ich einen Progressring eingefügt, der solange sichtbar ist, bis der Vorgang abgeschlossen ist.

    Es funktioniert, bin mir aber nicht sicher, ob das der "richtige" Weg ist:

            private void DoSomething()
            {
                VeryBusy = true;
    
                var backgroundScheduler = TaskScheduler.Default;
                var uiScheduler = TaskScheduler.FromCurrentSynchronizationContext();
                Task.Factory.StartNew(delegate { SaveXML(); },
                                      backgroundScheduler).
                ContinueWith(delegate { UpdateUI(); }, uiScheduler);
    
                //Hier passiert noch mehr, daher soll nicht gewartet werden
            }
    
            private async void SaveXML()
            {
                await XmlIO.SaveObjectToXml(ListKidData, "hillybilly.xml");
            }
    
            private void UpdateUI()
            {
                VeryBusy = false;
            }

    Danke im voraus für Tips und Verbesserungsvorschläge..


    Freiberufler im Bereich Softwareentwicklung Von der PLC und Robotik zu VB.NET & C#, vorrangig WPF und UWP

    Dienstag, 21. März 2017 12:15

Antworten

  • Hallo Stefan,

    wie Du schon selbst schreibst gibt es keine richtigen weg. Ich würde das ganze nur etwas leserlicher machen und im selben Thread bleiben

    async void TestSuche()
            {
                Busy(true);
                var nichtwarten = Task.Run(() =>
                {
                    //Mach was und warte nicht
                });
    
                //Mach weitere sachen
    
                await Task.WhenAll(nichtwarten); //Hier kannst Du auch eine Liste übergeben und auf alle Task warten
                Busy(false);
            }


    Gruß, Thomas

    Sage nie, ich kann es nicht - sage nur, ich kann es noch nicht!

    Icon für UWP

    Dienstag, 21. März 2017 15:14

Alle Antworten

  • Hallo Stefan,

    wie Du schon selbst schreibst gibt es keine richtigen weg. Ich würde das ganze nur etwas leserlicher machen und im selben Thread bleiben

    async void TestSuche()
            {
                Busy(true);
                var nichtwarten = Task.Run(() =>
                {
                    //Mach was und warte nicht
                });
    
                //Mach weitere sachen
    
                await Task.WhenAll(nichtwarten); //Hier kannst Du auch eine Liste übergeben und auf alle Task warten
                Busy(false);
            }


    Gruß, Thomas

    Sage nie, ich kann es nicht - sage nur, ich kann es noch nicht!

    Icon für UWP

    Dienstag, 21. März 2017 15:14
  • Stimmt, das ist wesentlich  lesbarer...

    Danke


    Freiberufler im Bereich Softwareentwicklung Von der PLC und Robotik zu VB.NET & C#, vorrangig WPF und UWP

    Dienstag, 21. März 2017 17:27