My plan is to have a user write down a movie title in my program and my program will pull the appropiate information asynchronously so the UI doesn\'t freeze up.
Her
There is a newer DownloadDataTaskAsync method that allows you to await the result. It is simpler to read and easier to wire up by far. I'd use that...
var client = new WebClient();
var data = await client.DownloadDataTaskAsync(new Uri(imageUrl));
await outstream.WriteAsync(data, 0, data.Length);
ThreadPool.QueueUserWorkItem(state => WebClientX.DownloadDataAsync(sitesearchURL));
http://workblog.pilin.name/2009/02/system.html
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);
}
You need to handle the DownloadDataCompleted event:
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");
}
The args contains other bits of information relating to error conditions etc - check those too.
Also note that you'll be coming into DownloadDataCompleted on a different thread; if you are in a UI (winform, wpf, etc) you'll need to get to the UI thread before updating the UI. From winforms, use this.Invoke. For WPF, look at the Dispatcher.
If anyone using above in web application or websites please set Async = "true" in the page directive declaration in aspx file.
//using ManualResetEvent class
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);
}