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.
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
.
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);
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);
}
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.
ThreadPool.QueueUserWorkItem(state => WebClientX.DownloadDataAsync(sitesearchURL));
// 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);
}