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)
如果您正在使用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请求.
| 归档时间: |
|
| 查看次数: |
2800 次 |
| 最近记录: |