Использование веб-клиента в методе - PullRequest
0 голосов
/ 28 февраля 2012

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

private string request(string json, string url) {

WebClient client = new WebClient();
client.DownloadStringCompleted += new DownloadStringCompletedEventHandler(client_DownloadStringCompleted);
client.DownloadStringAsync(new Uri(url);

}

Ответы [ 3 ]

2 голосов
/ 28 февраля 2012

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

Я думаю, что вы делаете ошибку проектирования, применяя блокирующий вызов старой школы.

Смотрите мой ответ в этом вопросе для решения. WebClient - дождаться загрузки файла

0 голосов
/ 28 февраля 2012

Этот синхронный метод можно использовать, но он заблокирует ваш поток, пока загрузка не будет завершена, и поэтому не является предпочтительным методом, но я думаю, что он ответит на ваш вопрос:

private string Request(string url) 
{
    WebClient client = new WebClient();
    return client.DownloadString(new Uri(url));
}
0 голосов
/ 28 февраля 2012

Поскольку веб-запрос выполняется асинхронно, нет простого способа получить этот блок методов и возвращать его только тогда, когда (если?) Получен ответ. (Есть способ сделать это, но его рекомендуют использовать по соображениям производительности, удобства использования и удобства обслуживания.)

Вместо этого вы должны написать код, предназначенный для асинхронного запуска.

Общий шаблон для вашей ситуации - указать метод обратного вызова, который выполняет действие в качестве конечного параметра.
Самый простой способ реализовать действие - это взять один параметр, который является объектом веб-ответа. Чтобы облегчить повторное использование кода и разделение проблем, вы, вероятно, захотите перейти к тому, чтобы действие приняло кортеж исключения или необработанного (или, возможно, отформатированного) содержимого ответа.

Вы хотите написать свой метод что-то вроде:

private string request(string json,
                       string url,
                       Action<Exception, string> callback)
{
    WebClient client = new WebClient();
    client.DownloadStringCompleted += (s, e) => 
        {
            // add better error handling than this!!!
            try
            {
                callback(e.Error, e.Result);
            }
            catch (Exception exc)
            {
                callback(exc, null);
            }
        };
    client.DownloadStringAsync(new Uri(url);    
}

В качестве альтернативы, вы можете использовать асинхронный ctp http://msdn.microsoft.com/en-us/vstudio/gg316360

...