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.