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 :)