C# 是否应该在Silverlight中重用WebClient实例
我正在为WindowsPhone7编写一个Silverlight应用程序,它有一个类需要向()发出多个请求 我最好为每个请求创建一个新的WebClient实例,还是在一个字段中初始化一个实例并为每个请求使用该实例(确保在任何时候只有一个请求处于活动状态)更有效C# 是否应该在Silverlight中重用WebClient实例,c#,silverlight,windows-phone-7,C#,Silverlight,Windows Phone 7,我正在为WindowsPhone7编写一个Silverlight应用程序,它有一个类需要向()发出多个请求 我最好为每个请求创建一个新的WebClient实例,还是在一个字段中初始化一个实例并为每个请求使用该实例(确保在任何时候只有一个请求处于活动状态)更有效 您还应该知道,如果像WCF客户端这样的代理,如果在连接过程中出现问题,web客户端可能不会保持愉快的状态。也就是说,它可能不是容错的 因此,我认为您应该每次都重新实例化它。另外,如果在中正确使用块,您将更有效地管理您的资源(尽管正如BFr
您还应该知道,如果像WCF客户端这样的代理,如果在连接过程中出现问题,web客户端可能不会保持愉快的状态。也就是说,它可能不是容错的 因此,我认为您应该每次都重新实例化它。另外,如果在
中正确使用块,您将更有效地管理您的资源(尽管正如BFree所指出的,WebClient并不是一个特别繁重的资源)
这并不是说这会特别有帮助,但对于特定于WCF web服务的解决方案,我们使用基于的实现为我们的WCF web服务代理提供容错web客户端。我们需要这样做,因为我们只是在启动时注入WCF端点(在某些情况下是模拟的)。如果您使用的是WebClient
,我每次都会创建一个新的。我还将为DownloadStringCompleted
事件使用lambda表达式,因为这将使您能够将所有相关逻辑保持在一起。
e、 g:
这将使代码更易于阅读,从而便于维护
由于smaple代码也有嵌套的web请求(完成的事件启动另一个请求),重复使用同一个客户端可能会使调试更加困难
请注意,WebClient
会自动将已完成的事件封送回UI线程,因此您在那里执行的任何工作都将阻止该UI线程。如果您完成的事件除了对UI进行简单更新外,还进行了其他操作,则建议您使用HttpWebRequest
,以解决性能和可用性问题
如果您可以并行运行连续的web请求,或者(甚至更好)将逻辑(和响应)组合到单个请求中,我也建议您不要进行连续的web请求。我知道您所说的关于WCF代理可能陷入的坏脾气状态的内容!很想知道Silverlight的WebClient是否也类似。@BFree已经删除了他的答案,但只是重复一下,Silverlight的WebClient类中没有Dispose()方法,因此使用块在这里不相关。但是,作为个人偏好,如果很容易添加它们或记录第一次出现的情况,我会添加它们-总是处理任何IDisposable
,这是一个好习惯;即使对于WebClient,这样做也不会有什么害处。对于Silverlight来说,这样做是无害的,因为这是不可能的。IDisposable不是通过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
}
var wc = new WebClient();
wc.DownloadStringCompleted += (sender, e) => { GetServiceResources(); };
wc.DownloadStringAsync(new Uri("http://example.com/path", UriKind.Absolute));