Следует ли повторно использовать экземпляры WebClient в Silverlight - PullRequest
8 голосов
/ 15 декабря 2010

Я пишу приложение Silverlight для Windows Phone 7, у которого есть класс, который должен сделать несколько запросов к 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
}

Ответы [ 2 ]

6 голосов
/ 15 декабря 2010

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

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

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

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

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

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

2 голосов
/ 15 декабря 2010

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

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

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

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