Dziwne zachowanie metody

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:

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ść:

"\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.

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.

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