DownloadStringAsync wait for request completion
Asked Answered
I

6

12

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?

Interlocutress answered 21/2, 2011 at 20:45 Comment(0)
C
23

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);
Carlottacarlovingian answered 21/2, 2011 at 20:52 Comment(0)
N
26

With Dot.Net 4.5:

 public static async void GetDataAsync()
        {           
            DoSomthing(await new WebClient().DownloadStringTaskAsync(MyURI));
        }
Newfashioned answered 18/7, 2012 at 6:39 Comment(0)
C
23

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);
Carlottacarlovingian answered 21/2, 2011 at 20:52 Comment(0)
P
3

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.

Pilkington answered 21/2, 2011 at 20:50 Comment(0)
P
2

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;
}
Pithos answered 31/12, 2014 at 0:53 Comment(0)
C
0

You really want to WAIT for an async method to complete after you launch it, in the same thread? Why not just use the sync version then.

You should hook up the DownloadStringCompleted event and catch the result there. Then you can use it as a real Async method.

Covalence answered 21/2, 2011 at 20:52 Comment(0)
W
0

i had the same problem with WP7 i solved this method.await is not working wp7 but if you use Action you will callback Async functions

     public void Download()
     { 
         DownloadString((result) =>
         {
             //!!Require to import Newtonsoft.Json.dll for JObject!!
             JObject fdata= JObject.Parse(result);
             listbox1.Items.Add(fdata["name"].ToString());

         }, "http://graph.facebook.com/zuck");

    }

    public void DownloadString(Action<string> callback, string url)
    {
        WebClient client = new WebClient();
        client.DownloadStringCompleted += (p, q) =>
        {
            if (q.Error == null)
            {
                callback(q.Result);

            }

        };

        client.DownloadStringAsync(new Uri(url));

    }
Welton answered 10/4, 2013 at 7:26 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.