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