我正在为 Windows Phone 7 编写一个 Silverlight 应用程序,其中有一个类需要向WebClient.DownloadStringAsync http://msdn.microsoft.com/en-us/library/ms144202%28v=VS.95%29.aspx()
我是否最好为每个请求创建一个新的 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
我每次都会创建一个新的。我还会使用 lambda 表达式DownloadStringCompleted
事件,因为这将使您能够将所有相关逻辑放在一起。
e.g.:
var wc = new WebClient();
wc.DownloadStringCompleted += (sender, e) => { GetServiceResources(); };
wc.DownloadStringAsync(new Uri("http://example.com/path", UriKind.Absolute));
这应该使代码更易于阅读和维护。
因为您的示例代码还具有嵌套的 Web 请求(已完成的事件启动另一个请求),重复使用同一客户端可能会使调试更加困难。
请注意,WebClient
自动将已完成的事件编组回 UI 线程,因此您在那里执行的任何工作都会阻塞该 UI 线程。如果您完成的事件除了简单更新 UI 之外还执行其他操作,请使用HttpWebRequest
出于性能和可用性问题,建议改为使用。
如果您可以并行运行它们,或者(甚至更好)将逻辑(和响应)合并到单个请求中,我还建议不要发出连续的 Web 请求。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)