我正在为 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
}
最佳答案
如果您使用的是 WebClient
,我会每次都创建一个新的。我还会为 DownloadStringCompleted
事件使用 lambda 表达式,因为这将使您能够将所有相关逻辑放在一起。
例如:
var wc = new WebClient();
wc.DownloadStringCompleted += (sender, e) => { GetServiceResources(); };
wc.DownloadStringAsync(new Uri("http://example.com/path", UriKind.Absolute));
这应该使代码更易于阅读和维护。
因为您的 smaple 代码也有嵌套的网络请求(完成的事件启动另一个请求),重复使用同一个客户端可能会使调试更加困难。
请注意,WebClient
会自动将完成的事件编码回 UI 线程,因此您在那里所做的任何工作都会阻塞该 UI 线程。如果您完成的事件除了对 UI 进行简单更新之外还执行任何操作,建议使用 HttpWebRequest
来解决性能和可用性问题。
如果您可以并行运行它们或(甚至更好)将逻辑(和响应)组合到单个请求中,我还建议不要发出连续的 Web 请求。
关于c# - 是否应该在 Silverlight 中重用 WebClient 实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4444851/