Dziwne zachowanie metody

Dziwne zachowanie metody
kociol21
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 46
0

Chciałem zobaczyć, jak działają wywołania asynchroniczne i natknąłem się na samym początku na dość dziwne zachowanie programu. Otóż mam taki prościutki kawałek kodu:

Kopiuj
using (FileStream stream = File.Open("test.txt", FileMode.Open, FileAccess.Read))
            {
                byte[] buffer = new byte[stream.Length];
                stream.ReadAsync(buffer, 0, (int) stream.Length);

                string value = Encoding.UTF8.GetString(buffer);

                Console.WriteLine(value);
                Console.ReadKey(true);
            }

Czyli prosta sprawa, odczytuję sobie zawartość pliku. Plik zawiera 5 linijek tekstu. Kiedy daję 'run' konsola wyświetla pięć pustych linijek i czeka na klawisz. Coś jest nie tak. I rzeczywiście, dając pauzę w debuggerze, widzę, że zmienna 'value' ma wartość:

Kopiuj
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"

OK, może robię coś nie tak. Tylko to co mnie dziwi, że kiedy przechodzę debuggerem krokowo przez step into, wszystko odbywa się normalnie, zmienna 'value' ma poprawną wartość odczytaną z pliku, wyświetla ją w konsoli prawidłowo.
Co jest? Kod jest albo błędny albo dobry, więc na chłopski rozum albo powinien dawać wyniki poprawne albo nie. Dlaczego więc daje różne wyniki w zależności od tego w jakim trybie włączę debugger?

Oczywiście pomijam tu zasadność stosowania w takiej sytuacji metody ReadAsync, chodzi tylko o zasadę działania.

RE
  • Rejestracja: dni
  • Ostatnio: dni
4

Bardzo proste, w momencie przekazania bufora do metody GetString nie został on jeszcze uzupełniony - plik nie został odczytany. W tym wypadku trzeba użyć async i await. Na MSDN jest dokładny przykład.
Działa na to na tej zasadzie, że wywołanie twojej metody zatrzyma się na czas czytania pliku, ale (w przeciwieństwie do wywołania synchronicznego, blokującego) wątek, z którego ta metoda została wywołana (najczęściej UI) nie będzie zajęty.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.