WebClient实例是否应在Silverlight中重用

Dav*_*ner 8 c# silverlight windows-phone-7

我正在为Windows Phone 7编写一个Silverlight应用程序,它有一个需要向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
}
Run Code Online (Sandbox Code Playgroud)

Mat*_*cey 6

如果您正在使用WebClient我每次都会创建一个新的.我还会为DownloadStringCompleted事件使用lambda表达式,因为这将使您能够将所有相关逻辑保持在一起.
例如:

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

这应该使代码更容易阅读,从而维护.

因为你的smaple代码也有嵌套的web请求(完成的事件启动另一个请求)重用同一个客户端会使调试更加困难.

请注意,WebClient自动将已完成的事件编组回UI线程,因此您在那里执行的任何工作都将阻止该UI线程.如果您完成的事件除了对UI进行简单更新之外还执行任何操作,HttpWebRequest则建议使用" 性能"和"可用性问题".

如果您可以并行运行它们,或者(甚至更好)将逻辑(和响应)组合到单个请求中,我还建议不要连续发出Web请求.