2010-12-14 14 views
7

Estoy escribiendo una aplicación de Silverlight para Windows Phone 7, que tiene una clase que necesita para hacer múltiples solicitudes de WebClient.DownloadStringAsync()webclient casos ser reutilizados en Silverlight

¿Me conviene crear una nueva instancia de cliente Web para cada solicitud, o es más eficiente inicializar una sola instancia en un campo y usar eso para cada solicitud (asegurándose de tener solo una solicitud activa en un momento dado)?

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 
} 

Respuesta

6

Si está utilizando WebClient que crearía una nueva cada vez. También usaría una expresión lambda para el evento DownloadStringCompleted, ya que esto le permitirá mantener unida la lógica relacionada.
ej .:

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

Esto debería hacer que el código sea más fácil de leer y por lo tanto mantener.

En que su código smaple también ha anidado peticiones web (finalizado el evento comienza otra solicitud) reutilización del mismo cliente podría hacer más difícil la depuración.

Tenga en cuenta que el WebClient clasifica automáticamente el evento completo en el hilo de la interfaz de usuario, por lo que cualquier trabajo que realice bloqueará ese subproceso de la interfaz de usuario. Si su evento completo no es más que una simple actualización de la interfaz de usuario, se recomienda el uso de HttpWebRequest en lugar de problemas de rendimiento y usabilidad.

También me gustaría recomendar en contra de hacer peticiones web consecutivos si ellos posiblemente podría ejecutar en paralelo o (aún mejor) combinar la lógica (y respuesta) en una sola solicitud.

2

También debe tener en cuenta, que si algo como cliente WCF como proxy del cliente web probablemente no permanecer en un estado feliz si algo va mal durante una conexión. Es decir, probablemente no sea tolerante a las fallas.

Por lo tanto, creo que probablemente solo deberías volver a crear instancias cada vez. Además, si se usa correctamente en los bloques using, administrará sus recursos de manera más efectiva (aunque, como señala BFree, WebClient no es un recurso particularmente pesado).

No es que esto ayude específicamente, pero para una solución específica de servicio web WCF utilizamos una implementación basada en http://www.acorns.com.au/blog/?p=113 para proporcionar un cliente web tolerante a errores para nuestros proxies de servicios web WCF. Lo requeríamos ya que solo dependemos de la inyección de los puntos finales WCF (o simulacros en algunos casos) al inicio.

+0

Sé de lo que estás hablando sobre el estado de mal humor en el que los proxies de WCF se pueden meter. Sería interesante saber si también es similar para el WebClient de Silverlight. –

+2

@BFree ha eliminado su respuesta, pero solo para repetir que no hay un método Dispose() en la clase WebClient de Silverlight, por lo que el uso de bloques no es relevante aquí. –

+0

Como preferencia personal, sin embargo, agregaría em si es fácil de hacerlo o documentar la primera vez que ocurre; es un buen hábito siempre desechar cualquier cosa 'IDisposable'; y no es dañino hacerlo incluso para WebClient. –

Cuestiones relacionadas