web-dev-qa-db-fra.com

Comment utiliser la méthode WebClient.DownloadDataAsync () dans ce contexte?

Mon plan est de faire en sorte qu'un utilisateur écrive un titre de film dans mon programme et celui-ci extraira les informations appropriées de manière asynchrone pour que l'interface utilisateur ne se fige pas.

Voici le code:

public class IMDB
    {
        WebClient WebClientX = new WebClient();
        byte[] Buffer = null;


        public string[] SearchForMovie(string SearchParameter)
        {
            //Format the search parameter so it forms a valid IMDB *SEARCH* url.
            //From within the search website we're going to pull the actual movie
            //link.
            string sitesearchURL = FindURL(SearchParameter);

            //Have a method download asynchronously the ENTIRE source code of the
            //IMDB *search* website.
            Buffer = WebClientX.DownloadDataAsync(sitesearchURL);


            //Pass the IMDB source code to method findInformation().

            //string [] lol = findInformation();

            //????

            //Profit.

            string[] lol = null;
            return lol;
        }

Mon problème actuel réside dans la méthode WebClientX.DownloadDataAsync (). Je ne peux pas utiliser une URL de chaîne pour cela. Comment puis-je utiliser cette fonction intégrée pour télécharger les octets du site (pour une utilisation ultérieure, je vais convertir ceci en chaîne, je sais comment faire cela) et sans geler mon interface graphique?

Peut-être un exemple clair de DownloadDataAsync afin que je puisse apprendre à l'utiliser?

Merci, vous êtes toujours une si bonne ressource.

17
Sergio Tapia

Vous devez gérer l'événement DownloadDataCompleted:

static void Main()
{
    string url = "http://google.com";
    WebClient client = new WebClient();
    client.DownloadDataCompleted += DownloadDataCompleted;
    client.DownloadDataAsync(new Uri(url));
    Console.ReadLine();
}

static void DownloadDataCompleted(object sender,
    DownloadDataCompletedEventArgs e)
{
    byte[] raw = e.Result;
    Console.WriteLine(raw.Length + " bytes received");
}

Les arguments contiennent d'autres bits d'information relatifs aux conditions d'erreur, etc. - vérifiez-les aussi.

Notez également que vous entrerez dans DownloadDataCompleted sur un autre thread; si vous êtes dans une interface utilisateur (winform, wpf, etc.), vous devez accéder au fil de l'interface avant de mettre à jour l'interface utilisateur. A partir de winforms, utilisez this.Invoke. Pour WPF, regardez la Dispatcher.

28
Marc Gravell

Il existe une nouvelle méthode DownloadDataTaskAsync qui vous permet d’attendre le résultat. Il est plus simple à lire et plus facile à câbler de loin. J'utiliserais ça ...

var client = new WebClient();

var data = await client.DownloadDataTaskAsync(new Uri(imageUrl));

await outstream.WriteAsync(data, 0, data.Length);
28
Bill Forney
static void Main(string[] args)
{
    byte[] data = null;
    WebClient client = new WebClient();
    client.DownloadDataCompleted += 
       delegate(object sender, DownloadDataCompletedEventArgs e)
       {
            data = e.Result;
       };
    Console.WriteLine("starting...");
    client.DownloadDataAsync(new Uri("http://stackoverflow.com/questions/"));
    while (client.IsBusy)
    {
         Console.WriteLine("\twaiting...");
         Thread.Sleep(100);
    }
    Console.WriteLine("done. {0} bytes received;", data.Length);
}
3
Rubens Farias

Si quelqu'un utilise ci-dessus dans une application Web ou sur des sites Web, définissez Async = "true" dans la déclaration de directive de page dans le fichier aspx.

3
ssmsnet
ThreadPool.QueueUserWorkItem(state => WebClientX.DownloadDataAsync(sitesearchURL));

http://workblog.pilin.name/2009/02/system.html

1
OnicDr

// en utilisant la classe ManualResetEvent

static ManualResetEvent evnts = new ManualResetEvent(false);
static void Main(string[] args)
{
    byte[] data = null;
    WebClient client = new WebClient();
    client.DownloadDataCompleted += 
        delegate(object sender, DownloadDataCompletedEventArgs e)
        {
             data = e.Result;
             evnts.Set();
        };
    Console.WriteLine("starting...");
    evnts.Reset();
    client.DownloadDataAsync(new Uri("http://stackoverflow.com/questions/"));
    evnts.WaitOne(); // wait to download complete

    Console.WriteLine("done. {0} bytes received;", data.Length);
}
0
Hung Le