Vra

Ek het 'n klein app wat 'n paar lêers uit 'n afgeleë (HTTP) bediener afgelaai om die gebruikers plaaslike hardeskyf, 'n paar van die lêers is groot, maar ek weet nie hoe groot te hardloop tyd weet. Is daar enige manier wat jou sal toelaat my af te laai 'n lêer met 'n soort van vordering meter?

Dit is 'n Winforms app, nou ek gebruik WebClient.DownloadFile () om die lêer af te laai.

Edit: Ek het gekyk na die DownloadProgressChanged en OnDownloadProgressChanged gebeure en dit lyk asof hulle goed te werk, maar hulle sal nie werk vir my oplossing. Ek laai 'n paar lêers en as ek WebClient.DownloadFileAsync gebruik dan die geleentheid is 'n paar keer genoem / tweede omdat elke lêer noem dit.
Hier is die basiese struktuur van die jeug:

  • Kry 'n lys van lêers tipies ongeveer 114
  • Begin 'n lus oor die lys van lêers en aflaai elkeen na sy desination

Ek gee nie om af te laai elke lêer seperatly maar sonder om hulle te laai met DownloadFileAsync () Ek kan nie die event handlers gebruik.

Was dit nuttig?

Oplossing

Gebruik WebClient.OnDownloadProgressChanged . Hou in gedagte, is dit slegs moontlik om vordering te bereken as die bediener verslae die grootte voorlangs.

EDIT:

As ons kyk na jou werk, wat jy kan probeer is om 'n tou van URLs. Dan, wanneer 'n lêer eindig aflaai ( DownloadDataCompleted gebeurtenis), sal jy die asinkroniseer aflaai van die volgende URL in die tou van stapel te stuur. Ek het dit nie getoets.

Ander wenke

Hanteer die WebClient DownloadProgressChanged gebeurtenis .

Ek het net hierdie geskryf en dit beslis lyk om te doen wat jy wil.

Ook binne die ProgressChanged Event jy het die "TotalBytesToReceive" eiendom en die "BytesReceived" eiendom.

private void StartDownload()
{

    // Create a new WebClient instance.
    WebClient myWebClient = new WebClient();

    // Set the progress bar max to 100 for 100%
    progressBar1.Value = 0;
    progressBar1.Maximum = 100;

    // Assign the events to capture the progress percentage
    myWebClient.DownloadDataCompleted+=new DownloadDataCompletedEventHandler(myWebClient_DownloadDataCompleted);
    myWebClient.DownloadProgressChanged+=new DownloadProgressChangedEventHandler(myWebClient_DownloadProgressChanged);

    // Set the Uri to the file you wish to download and fire it off Async
    Uri uri = new Uri("http://external.ivirtualdocket.com/update.cab");
    myWebClient.DownloadFileAsync(uri, "C:\\Update.cab");

}

void myWebClient_DownloadProgressChanged(object sender, System.Net.DownloadProgressChangedEventArgs e)
{
    progressBar1.Value = e.ProgressPercentage;
}

void myWebClient_DownloadDataCompleted(object sender, DownloadDataCompletedEventArgs e)
{
    progressBar1.Value = progressBar1.Maximum;
}

Ek moes 'n soortgelyke probleem op te los, en GenericTypeTea se kode voorbeeld het die knoop deurgehaak; behalwe dat ek ontdek dat die DownloadDataCompleted geval nie afgedank wanneer jy die DownloadFileAsync metode noem. In plaas daarvan, is die DownloadFileCompleted geleentheid ingesamel.

Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top