Metoda asynchroniczna Zapisu

0

Witam serdecznie. Mam mały problem jeżeli chodzi o zapis tekstu do pliku w metodzie asynchronicznej. Tworzę aplikację metro Win10. Mam o to taką metodę:

       public async void Zapisz(string savePath, string save)
        {
            string SavePath = savePath;
            string Save = save;

            StorageFolder local = ApplicationData.Current.LocalFolder;

            byte[] fileBytes = Encoding.UTF8.GetBytes(Save.ToCharArray());

            var file = await local.CreateFileAsync(SavePath,
                CreationCollisionOption.ReplaceExisting);

            using (var s = await file.OpenStreamForWriteAsync())
            {
                s.Write(fileBytes, 0, fileBytes.Length);
            }
        }
 

Posiadam w aplikacji kilka Page-ów. W jednym użytkownik wpisuje w Textbox Nazwę, Opis, oraz wybiera ikonę użytkownika.
Po kliknięciu przycisku Zapisz informację zostają wywołane w ten sposób:

 
            var Nowy1 = new Plik();
            Nowy1.Zapisz("Nazwa1.txt", Nazwa1);
            Nowy1.Zapisz("Opis1.txt", Opis1);
            Nowy1.Zapisz("Ikona1.txt", Ikona1);

Po czym przechodzi do Page'a Informacji w którym zostają wczytane oraz wyświetlone po przez użycie metody:


 public async Task<string> Wczytaj(string loadPath)
        {
            string LoadPath = loadPath;
            bool fileExists1;


            StorageFolder local = ApplicationData.Current.LocalFolder;

            try // Sprawdzanie czy pliki istnieją:
            {
                StorageFile _File1Check = local.GetFileAsync(LoadPath).AsTask().ConfigureAwait(false).GetAwaiter().GetResult();
                fileExists1 = _File1Check != null;

            }
            catch
            {
                fileExists1 = false;
            }

            if (fileExists1 == false) //Jeżeli nie istnieje tworzymy plik
            {

                byte[] fileBytes1 = System.Text.Encoding.UTF8.GetBytes("Empty".ToCharArray());

                var file1 = await local.CreateFileAsync(LoadPath,
                CreationCollisionOption.ReplaceExisting);

                using (var s = await file1.OpenStreamForWriteAsync())
                {
                    s.Write(fileBytes1, 0, fileBytes1.Length);

                    return null;
                }
            }
            else //Jeżeli istnieje odczytujemy
            {
                var _File18 = await local.OpenStreamForReadAsync(LoadPath);

                using (StreamReader streamReader1 = new StreamReader(_File18))
                {
                    var Save = streamReader1.ReadToEnd();
                    return Save; 

Oraz jej wywołanie:

            var CW1 = new Plik();
            Nazwa1 = await CW1.Wczytaj("Nazwa1.txt");
            Opis1 = await CW1.Wczytaj("Opis1.txt");
           (Ikona zostaje wczytana podczas ładowania obrazka (loaded))

 

Problem polega na tym że wszystko działa jeżeli użyję Punktów przerywania i jadę blok po bloku. Metoda zapisuję oraz odczytuję poprawnie.
Jeżeli puszczę apkę luźno to się sypię bo nie zdąży zapisać do pliku tekstu a metoda wczytująca dostaje do odczytania pusty plik.
Pytanie do was czy mam jakiś błąd w tych metodach lub czy można coś do nich dopisać żeby metoda wczytująca poczekała aż tekst zostanie zapisany w pliku?

1

Jak chcesz zaczekać aż operacja zapisu się skończy to powinieneś metodę Zapisz wywoływać z await.

 await Nowy1.Zapisz(...) 
0

Masz rację...masakra :/ że wcześniej na to nie wpadłem... Męczyłem się z tym już od dłuższego czasu. Wielkie dzięki za pomoc :)

Poprawiona wersja zapis:

 public async Task Zapisz(string savePath, string save)
        {
            string SavePath = savePath;
            string Save = save;

            StorageFolder local = ApplicationData.Current.LocalFolder;

            byte[] fileBytes = Encoding.UTF8.GetBytes(Save.ToCharArray());

            var file = await local.CreateFileAsync(SavePath,
                CreationCollisionOption.ReplaceExisting);

            using (var s = await file.OpenStreamForWriteAsync())
            {
                s.Write(fileBytes, 0, fileBytes.Length);
            }
        }
 

Wywołanie:

            var Nowy1 = new Plik();
            await Nowy1.Zapisz("Nazwa1.txt", Nazwa1);
            await Nowy1.Zapisz("Opis1.txt", Opis1);
            await Nowy1.Zapisz("Ikona1.txt", Ikona1);
 

1 użytkowników online, w tym zalogowanych: 0, gości: 1