2012-02-27 3 views
-1

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

private string request(string json, string url) { 

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

} 
+3

является то, что лучше? и, пожалуйста, не нужно грубить. – Nathan

+1

нет, это не лучше. И я не груб. Я просто пытаюсь помочь. –

+2

, тогда, пожалуйста, не беспокойтесь, отвечая на этот вопрос, если вы думаете, что это не грубо. Обычно, если кто-то попросил меня о помощи, я, конечно, не ответил бы этим отношением. – Nathan

ответ

0

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

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

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

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

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

Alternativey, вы могли бы использовать асинхронную CTP http://msdn.microsoft.com/en-us/vstudio/gg316360

2

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

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

См. Мой ответ в этом вопросе о решениях. WebClient - wait until file has downloaded

-2

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

private string Request(string url) 
{ 
    WebClient client = new WebClient(); 
    return client.DownloadString(new Uri(url)); 
} 
+1

Синхронный метод 'DownloadString' в WP7' WebClient' ... Вызов метода async синхронным способом не так-то просто ... –

Смежные вопросы