Pobieranie pliku, progress, optymalizacja

0

Chcę kontrolować postęp pobierania pliku. Jako przykład weźmy kod ze strony: http://www.devtoolshed.com/content/c-download-file-progress-bar

while ((iByteSize = streamRemote.Read(byteBuffer, 0, byteBuffer.Length)) > 0)
                {
                    streamLocal.Write(byteBuffer, 0, iByteSize);
                    iRunningByteTotal += iByteSize;
 
                    // calculate the progress out of a base "100"
                    double dIndex = (double)(iRunningByteTotal);
                    double dTotal = (double)byteBuffer.Length;
                    double dProgressPercentage = (dIndex / dTotal);
                    int iProgressPercentage = (int)(dProgressPercentage * 100);
 
                    backgroundWorker1.ReportProgress(iProgressPercentage);
                }

W ostatniej linii nie będę zwiększał wartości paska postępu a wysyłał tą wartość przez sieć - załóżmy że będzie to metoda WebService'u. Pobieranie pliku nie powinno być przerywane ze względu na to, że coś trzeba gdzieś wywołać.

Jak teraz zrealizować pobieranie pliku z obsługą postępu pobierania bez przerywania pobierania? Oczywiście mogą być wątki, ale czas tworzenia wątku to też jest koszt. Myślałem o timerze, który np. co sekundę będzie sprawdzał czy zmieniła się wartość postępu i jeżeli się zmieniła to wtedy będzie reagował (oczywiście asynchronicznie). Co sądzicie o tym rozwiązaniu?

0

Najprościej: umożliwia to klasa WebClient przy użyciu metod DownloadDataAsync, DownloadFileAsync albo OpenReadAsync. Odpalane jest wtedy zdarzenie DownloadProgressChanged.

Dzieje się to dość często, więc jeżeli chcesz wysyłać ten postęp przez sieć to zapisuj go gdzieś najpierw i faktycznie wysyłaj go co sekundę w oddzielnym wątku.

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