Intereting Posts
Удаление десериализации JSON в объект Существуют ли какие-либо связи между Haskell и LINQ? Есть встроенный диалог подтверждения в Windows Forms? Есть ли хороший типизированный способ выполнения событий PropertyChanged в C #? Передача параметров в UseFactoryMethod в Castle Windsor MongoDB .Net driver 2.0 Pull (удалить элемент) Можете ли вы перейти на конкретные свойства в VS 2010? Как я могу перетаскивать строки DataGridView друг под друга? Могу ли я создать конструктор для Enum? сохранять изображения в режиме управления веб-браузером, не перегружая их из Интернета TDD – 100% охват методов, которые обертывают SQL заставляя xslt использовать версию 2 с xslCompiledTransform C # winform, как текстовое поле стало нулевым при нажатии кнопки второй раз? C # Перечисления с зарезервированными ключевыми словами Преобразование формата даты строки в дату и время MM / dd / yyyy, когда форматом даты системы является dd / MM / yyyy

Если экземпляры WebClient будут повторно использоваться в Silverlight

Я пишу приложение Silverlight для Windows Phone 7, у которого есть class, который должен выполнять несколько запросов к WebClient.DownloadStringAsync ()

Мне лучше создать новый экземпляр WebClient для каждого запроса, или эффективнее ли инициализировать один экземпляр в поле и использовать его для каждого запроса (если у вас есть только один запрос активным в любой момент времени)?

public class MainViewModel : INotifyPropertyChanged { private readonly WebClient _wc; public MainViewModel() { _wc = new WebClient { Credentials = new NetworkCredential( "yyyyyyy", @"xxxxxx" ) }; } readonly Uri _baseUrl = new Uri( @"https://some.web.url" ); public void GetServices() { _wc.DownloadStringCompleted += GetServicesCompleted; var uri = new Uri( _baseUrl, "/path" ); _wc.DownloadStringAsync( uri ); } private void GetServicesCompleted( object sender, DownloadStringCompletedEventArgs e ) { _wc.DownloadStringCompleted -= GetServicesCompleted; string result = e.Result; // other logic... GetServiceResources(); } private void GetServiceResources() { _wc.DownloadStringCompleted += GetServicesResourcesDownloaded; var url = new Uri( _baseUrl, "/path2" ); _wc.DownloadStringAsync( url ); } // etc } 

Если вы используете WebClient я бы каждый раз создавал новый. Я также использовал бы выражение lambda для события DownloadStringCompleted как это позволит вам сохранить вместе всю связанную логику.
например:

 var wc = new WebClient(); wc.DownloadStringCompleted += (sender, e) => { GetServiceResources(); }; wc.DownloadStringAsync(new Uri("http://example.com/path", UriKind.Absolute)); 

Это должно сделать код более удобным для чтения и, следовательно, поддерживать.

В том, что ваш код smaple также имеет вложенные веб-запросы (завершенное событие запускает другой запрос) повторное использование одного и того же клиента может затруднить отладку.

Помните, что WebClient автоматически переводит завершенное событие обратно в stream пользовательского интерфейса, поэтому любая работа, которую вы там делаете, блокирует этот stream пользовательского интерфейса. Если ваше завершенное событие ничего не делает, кроме простого обновления пользовательского интерфейса, использование HttpWebRequest рекомендуется вместо этого для повышения производительности и удобства использования.

Я также рекомендовал бы не создавать последовательные веб-запросы, если бы вы могли запускать их параллельно или (даже лучше) объединить логику (и ответ) в один запрос.

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

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

Не то, чтобы это конкретно помогло, но для конкретного решения WCF для веб-служб мы использовали реализацию на основе http://www.acorns.com.au/blog/?p=113, чтобы предоставить отказоустойчивый веб-клиент для нашего веб-сайта WCF услуг. Мы требовали этого, поскольку мы были только зависимостью, вставляя конечные точки WCF (или макет в некоторых случаях) при запуске.