Avatar billede tgv Nybegynder
16. november 2006 - 17:09 Der er 1 kommentar og
2 løsninger

Webclient delegates

Hej.

Jeg har en webclient i c#

WebClient client = new WebClient();

og vil gerne læse filer asynkront fra en server. Dette kan gøres med kommandoen client.OpenReadAsync(new URI(link)). For at vide hvornår en fil er downloadet færdigt er der en OpenReadCompleted delegate inkluderet i klassen.

Mit problem er at delegaten ser således ud:

private void OpenReadCallback(object sender, OpenReadCompletedEventArgs e)
{
...
}

Jeg kan læse filen ved new Stream = e.Result. Men hvordan finder jeg ud af hvilken fil der er hentet? Jeg kan ikke se det fremgår noget sted af parametrene til delegaten. Mit spørgsmål er altså

1. Jeg kan finde ud af hvornår en fil er hentet og åbne en stream til denne. Men hvordan finder jeg ud af filnavnet?

2. MSDN beskriver at funktionen kan kaldes med et userObjekt som
client.OpenReadAsync(link,userObject) men undlader at beskrive dette nærmere. Hvordan får jeg fat i objektet når OpenReadCompletedEventArgs bliver kaldet?

Events for webclient: http://msdn2.microsoft.com/en-us/library/y4h84e55.aspx

Selve klassen: http://msdn2.microsoft.com/en-us/library/system.net.webclient.aspx

På forhånd tak :)
Avatar billede driis Nybegynder
16. november 2006 - 18:50 #1
Dit userObject er e.UserState. Eksempel følger:
Avatar billede driis Nybegynder
16. november 2006 - 18:50 #2
using System;
using System.Net;
using System.Threading;

namespace TestAsyncWebClient
{
    class Program
    {     
        static Semaphore semThreads = new Semaphore(2,2);
        static void Main(string[] args)
        {
            WebClient wc1 = new WebClient();
            WebClient wc2 = new WebClient();
            wc1.OpenReadCompleted += new OpenReadCompletedEventHandler(wc_OpenReadCompleted);
            wc1.OpenReadAsync(new Uri("http://www.eksperten.dk"),"Eksperten.dk");
            semThreads.WaitOne();
            wc2.OpenReadCompleted += new OpenReadCompletedEventHandler(wc_OpenReadCompleted);
            wc2.OpenReadAsync(new Uri("http://www.google.dk"),"Google");
            semThreads.WaitOne();
            Console.WriteLine("Requests started");

            semThreads.WaitOne();
            semThreads.WaitOne();
            Console.WriteLine("All requests finished");
            while (semThreads.Release() > 0) ;
            semThreads.Close();
        }

        static void wc_OpenReadCompleted(object sender, OpenReadCompletedEventArgs e)
        {           
            Console.WriteLine("Request finished: {0}",e.UserState);
            semThreads.Release();
        }
    }
}
Avatar billede tgv Nybegynder
17. november 2006 - 22:02 #3
Helt perfekt. Så slipper jeg for min ekstremt grimme arraylist/lock implementation :)
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