Avatar billede psyclown Nybegynder
21. september 2011 - 22:06 Der er 1 løsning

Lille problem med progress og backgroundworker

Hej,

Jeg er lige startet med at programmere c# og synes det er ganske udfordrende og der er mange ting at lære har jeg fundet ud af.
Normalt prøver jeg altid at løse tingene ting og finde info på nettet, men er nu kommet i den situation at jeg er løbet tør for oplysninger og med min stadig manglende erfaring og viden, er der ikke andre udveje :).

Nu til sagen.
Jeg har denne kode:

        private void frm_movie_db_Load(object sender, EventArgs e)
        {
            if (!File.Exists("movies.list.gz")){
                bg_worker.RunWorkerAsync();
            }
        }

        private void bg_worker_DoWork(object sender, DoWorkEventArgs e)
        {
            string strDownloadFrom = "ftp://ftp.sunet.se/pub/tv+movies/imdb/movies.list.gz";
            string strDownloadTo = "movies.list.gz";

            try
            {
                FtpWebRequest request = (FtpWebRequest)WebRequest.Create(strDownloadFrom);

                request.Method = WebRequestMethods.Ftp.GetFileSize;
                request.Credentials = new NetworkCredential("anonymous", "");
                request.UsePassive = true;
                request.UseBinary = true;
                request.KeepAlive = true;

                Int64 intFileSize = request.GetResponse().ContentLength;
                Int64 intRunningByteTotal = 0;

                request = (FtpWebRequest)FtpWebRequest.Create(strDownloadFrom);
                request.Method = WebRequestMethods.Ftp.DownloadFile;
                request.Credentials = new NetworkCredential("anonymous", "");
                request.UsePassive = true;
                request.UseBinary = true;
                request.KeepAlive = false;

                FtpWebResponse response = (FtpWebResponse)request.GetResponse();
                Stream reader = response.GetResponseStream();

                Stream writer = new FileStream(strDownloadTo, FileMode.Create, FileAccess.Write, FileShare.None);
                byte[] byteBuffer = new byte[1024];

                int intByteSize = 0;
                int intProgressPct = 0;

                while ((intByteSize = reader.Read(byteBuffer, 0, byteBuffer.Length)) > 0)
                {
                    if (intByteSize == 0)
                    {
                        intProgressPct = 100;
                        bg_worker.ReportProgress(intProgressPct);
                    }
                    else
                    {
                        writer.Write(byteBuffer, 0, intByteSize);

                        if (intByteSize + intRunningByteTotal <= intFileSize)
                        {
                            intRunningByteTotal += intByteSize;
                            double dIndex = intRunningByteTotal;
                            double dTotal = byteBuffer.Length;
                            double dProgressPct = (double)(dIndex / dTotal);
                            intProgressPct = (int)dProgressPct;
                            bg_worker.ReportProgress(intProgressPct);
                        }
                    }
                }

                //reader.Close();
                //mem_stream.Close();
                //response.Close();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());
            }
        }

        private void bg_worker_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            //pb_download_files.Value = e.ProgressPercentage;
            lbl_progress_pct.Text = e.ProgressPercentage.ToString() + "%";
        }

        private void bg_worker_RunWorkerComplete(object sender, RunWorkerCompletedEventArgs e)
        {
            pnlProgress.Visible = false;
        }

Det virker som sådan ganske udemærket og den downloader hvad den skal. kan bare ikke få progress til at virke.
Har prøvet at skrive intProgressPct til skærmen i mit while loop og den skriver fint procenterne.
Har gjort det samme med e.ProgressPercentage.ToString() i bg_worker_ProgressChanged method, som også skriver det rigtige.
Men når jeg skriver e.ProgressPercentage.ToString() til min label eller til progress.value, så skriver den noget helt andet.

Der findes nok en mindre begynder fejl et sted og håber at en af jer kan se sig ud af det :)
Avatar billede psyclown Nybegynder
22. september 2011 - 13:38 #1
En lille matematisk regnefejl var problemet.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester