2010-12-14 12 views
7

Piszę aplikacji Silverlight dla Windows Phone 7, który ma klasę, która musi dokonać wielu żądań do WebClient.DownloadStringAsync()Jeżeli webclient przypadki ponownego wykorzystania w Silverlight

Am I lepiej tworząc nową instancję dla WebClient każde żądanie, czy też skuteczniejsze jest inicjowanie pojedynczej instancji w polu i używanie jej dla każdego żądania (upewniając się, że tylko jedno żądanie jest aktywne w tym samym czasie)?

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 
} 

Odpowiedz

6

Jeśli używasz WebClient, za każdym razem utworzę nowy. Użyłbym również wyrażenia lambda dla zdarzenia DownloadStringCompleted, ponieważ pozwoli to zachować razem wszystkie powiązane logiki.
np .:

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

To powinno sprawić, że kod łatwiejsze do odczytania, a zatem utrzymać.

W tym, że twój kod smaple zawiera również zagnieżdżone żądania sieciowe (zakończone zdarzenie rozpoczyna inne żądanie) ponowne użycie tego samego klienta może utrudnić debugowanie.

Należy pamiętać, że WebClient automatycznie powoduje przeniesienie zakończonego zdarzenia z powrotem do wątku interfejsu użytkownika, więc wszelka praca, którą tam wykonasz, zablokuje ten wątek interfejsu użytkownika. Jeśli ukończone wydarzenie robi coś innego niż zwykłą aktualizację interfejsu użytkownika, zamiast tego zaleca się użycie parametru HttpWebRequest w celu uzyskania poprawy wydajności i użyteczności.

Polecam także odradzanie kolejnych żądań internetowych, jeśli możliwe jest równoległe ich uruchamianie lub (jeszcze lepiej) połączenie logiki (i odpowiedzi) w jedno żądanie.

2

Należy również zdawać sobie sprawę, że jeśli coś takiego klienta WCF Prokurenci klient internetowej prawdopodobnie nie będzie pozostawać w stanie szczęśliwy, jeśli coś pójdzie nie tak w trakcie połączenia. Oznacza to, że prawdopodobnie nie jest odporny na błędy.

Dlatego uważam, że powinieneś po prostu powtórzyć to za każdym razem. Plus, jeśli użyjesz go poprawnie w blokach using, będziesz efektywniej zarządzał swoimi zasobami (choć jak wskazuje BFree, WebClient nie jest szczególnie ciężkim zasobem).

Nie oznacza to, że będzie to szczególnie pomocne, ale w przypadku konkretnego rozwiązania usługi sieciowej WCF skorzystaliśmy z implementacji opartej na http://www.acorns.com.au/blog/?p=113, aby zapewnić odpornego na uszkodzenia klienta WWW dla naszych serwerów proxy usług internetowych WCF. Wymagaliśmy tego, ponieważ byliśmy uzależnieni od wstrzykiwania punktów końcowych WCF (lub fałszywego w niektórych przypadkach) podczas uruchamiania.

+0

Wiem, o czym mówisz, jeśli chodzi o zrzędliwy stan, w którym mogą się znaleźć pełnomocnicy WCF! Byłoby interesujące dowiedzieć się, czy jest podobny do WebLienta Silverlight. –

+2

@BFree usunął swoją odpowiedź, ale tylko po to, aby powtórzyć, że nie ma metody Dispose() w klasie WebClienta Silverlight, więc używanie bloków nie ma tutaj znaczenia. –

+0

Jako osobistą preferencję jednak dodałem je, jeśli jest to łatwe lub udokumentować pierwsze wystąpienie - to dobry nawyk, aby zawsze pozbywać się wszystkiego, co jest IDisposable; i nie jest to szkodliwe nawet dla WebClient. –

Powiązane problemy