// Speed
System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch();
int tempBytes = 0;
sw.Start();
while ((readedBytes = stream.Read(chunk, 0, chunk.Length)) > 0)
{
str.Write(chunk, 0, readedBytes);
totalReadedBytes += readedBytes;
tempBytes += readedBytes;
if (sw.ElapsedMilliseconds > _upDownUpdateTimeInterval)
{
OnChanged(new ProgressChangedEventArgs(totalReadedBytes, size, (int)(((Double)tempBytes / (sw.ElapsedMilliseconds + 1)) * 1000)));
sw.Reset();
sw.Start();
tempBytes = 0;
}
if (str.Length == size)
break;
}
sw.Stop();
To coś służy do pobierania plików (stream = NetworkStream). Problem polega na tym, że już niejednokrotnie miałem zgłaszane, że prędkość po jakimś czasie jest niepoprawna.
To jest pojedyncze pobieranie uruchomione na wątku. Takich wątków jest, np. 20, na każdym chodzi osobny StopWatch, a wszystko jest wrzucane na główny wątek poprzez OnChanged event.
Po przeszukaniu netu znalazłem kilka informacji, między innymi http://kristofverbiest.blogspot.com/2008/10/beware-of-stopwatch.html co w jakimś stopniu mogłoby tłumaczyć niepoprawne wyniki w niektórych przypadkach, choć zweryfikować osobiście aktualnie nie mogę. Większość osób informowała, że problem występuje po dłuższym używaniu. Na początku pobiera z normalną prędkością, a potem pokazuje kilkukrotnie niższą, jednak w rzeczywistości pobierając tak samo szybko (zapis pliku na dysku). Natomiast gdy zacząłem szukać innego sposobu na odmierzenie czasu (np. DateTime.UtcNow) to wszędzie było info by używać właśnie StopWatch.
Może to nie wina StopWatch, ale ciężko znaleźć mi inną przyczynę. OnChanged to event podłączony bezpośrednio pod główny wątek, tam dane są jeszcze przeliczane (bajty na KB lub MB) i wyświetlane, ale błąd nie leży w kwestii obliczeń, bo matematyka jest zawsze taka sama tylko w kwestii ich zbierania.
Jak ktoś ma jakieś sugestie, pomysły - będę wdzięczny.