Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/271.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/silverlight/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 是否应该在Silverlight中重用WebClient实例_C#_Silverlight_Windows Phone 7 - Fatal编程技术网

C# 是否应该在Silverlight中重用WebClient实例

C# 是否应该在Silverlight中重用WebClient实例,c#,silverlight,windows-phone-7,C#,Silverlight,Windows Phone 7,我正在为WindowsPhone7编写一个Silverlight应用程序,它有一个类需要向()发出多个请求 我最好为每个请求创建一个新的WebClient实例,还是在一个字段中初始化一个实例并为每个请求使用该实例(确保在任何时候只有一个请求处于活动状态)更有效 您还应该知道,如果像WCF客户端这样的代理,如果在连接过程中出现问题,web客户端可能不会保持愉快的状态。也就是说,它可能不是容错的 因此,我认为您应该每次都重新实例化它。另外,如果在中正确使用块,您将更有效地管理您的资源(尽管正如BFr

我正在为WindowsPhone7编写一个Silverlight应用程序,它有一个类需要向()发出多个请求

我最好为每个请求创建一个新的WebClient实例,还是在一个字段中初始化一个实例并为每个请求使用该实例(确保在任何时候只有一个请求处于活动状态)更有效


您还应该知道,如果像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));