I am using this code to retrieve an url content:
private ArrayList request(string query)
{
ArrayList parsed_output = new ArrayList();
string url = string.Format(
"http://url.com/?query={0}",
Uri.EscapeDataString(query));
Uri uri = new Uri(url);
using (WebClient client = new WebClient())
{
client.DownloadStringAsync(uri);
}
// how to wait for DownloadStringAsync to finish and return ArrayList
}
I want to use DownloadStringAsync
because DownloadString
hangs the app GUI, but I want to be able to return the result on request
. How can I wait until DownloadStringAsync
finish the request?
With Dot.Net 4.5:
public static async void GetDataAsync()
{
DoSomthing(await new WebClient().DownloadStringTaskAsync(MyURI));
}
why would you want to wait... that will block the GUI just as before!
var client = new WebClient();
client.DownloadStringCompleted += (sender, e) =>
{
doSomeThing(e.Result);
};
client.DownloadStringAsync(uri);
From the msdn documentation:
When the download completes, the DownloadStringCompleted event is raised.
When hooking this event, you will receive DownloadStringCompletedEventArgs, this contains a string
property Result
with the resulting string.
this will keep your gui responsive, and is easier to understand IMO:
public static async Task<string> DownloadStringAsync(Uri uri, int timeOut = 60000)
{
string output = null;
bool cancelledOrError = false;
using (var client = new WebClient())
{
client.DownloadStringCompleted += (sender, e) =>
{
if (e.Error != null || e.Cancelled)
{
cancelledOrError = true;
}
else
{
output = e.Result;
}
};
client.DownloadStringAsync(uri);
var n = DateTime.Now;
while (output == null && !cancelledOrError && DateTime.Now.Subtract(n).TotalMilliseconds < timeOut)
{
await Task.Delay(100); // wait for respsonse
}
}
return output;
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With