DownloadStringAsync ожидает завершения запроса - PullRequest
12 голосов
/ 21 февраля 2011

Я использую этот код для получения содержимого URL:

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
    }

Я хочу использовать DownloadStringAsync, потому что DownloadString зависает в графическом интерфейсе приложения, но я хочу иметь возможность вернуть результат на request. Как я могу дождаться, пока DownloadStringAsync завершит запрос?

Ответы [ 6 ]

26 голосов
/ 18 июля 2012

С Dot.Net 4.5:

 public static async void GetDataAsync()
        {           
            DoSomthing(await new WebClient().DownloadStringTaskAsync(MyURI));
        }
23 голосов
/ 21 февраля 2011

зачем вам ждать ... это блокирует графический интерфейс, как и раньше!

var client = new WebClient();
client.DownloadStringCompleted += (sender, e) => 
{
   doSomeThing(e.Result);
};

client.DownloadStringAsync(uri);
3 голосов
/ 21 февраля 2011

Из документации msdn :

По завершении загрузки возникает событие DownloadStringCompleted .

Когдаперехватывая это событие, вы получите DownloadStringCompletedEventArgs , в котором содержится string свойство Result с результирующей строкой.

2 голосов
/ 31 декабря 2014

это будет держать ваш графический интерфейс отзывчивым, и 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;
}
0 голосов
/ 10 апреля 2013

У меня была такая же проблема с WP7, я решил этот метод. Wa7 не работает, но если вы используете Action, вы будете вызывать функции Async

     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));

    }
0 голосов
/ 21 февраля 2011

Вы действительно хотите дождаться завершения асинхронного метода после его запуска в том же потоке? Почему бы тогда просто не использовать версию синхронизации.

Вы должны подключить событие DownloadStringCompleted и поймать результат там. Тогда вы можете использовать его как настоящий асинхронный метод.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...