Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/85.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# 如果处置我的网络客户端,我是否需要取消订阅网络客户端的事件_C#_Events_Webclient_Idisposable - Fatal编程技术网

C# 如果处置我的网络客户端,我是否需要取消订阅网络客户端的事件

C# 如果处置我的网络客户端,我是否需要取消订阅网络客户端的事件,c#,events,webclient,idisposable,C#,Events,Webclient,Idisposable,所以我把我的网络客户端包装在一个using语句中。但我突然想知道,如果我的对象实现了IDisposable并包装在using Station中,我是否需要取消订阅事件 下面是我当前如何使用我的WebClient的示例代码。此代码当前是否存在内存泄漏,因为它没有取消订阅事件,或者dispose方法是否会处理此问题 using (WebClient wc = new WebClient()) { wc.DownloadProgressChanged += ((sender, args) =&

所以我把我的网络客户端包装在一个using语句中。但我突然想知道,如果我的对象实现了IDisposable并包装在using Station中,我是否需要取消订阅事件

下面是我当前如何使用我的
WebClient
的示例代码。此代码当前是否存在内存泄漏,因为它没有取消订阅事件,或者dispose方法是否会处理此问题

using (WebClient wc = new WebClient())
{
    wc.DownloadProgressChanged += ((sender, args) =>
    {
       //monitor something
    });
    wc.DownloadFileCompleted += ((sender, args) =>
    {
       //do something
    });
    wc.DownloadFileAsync(new Uri(string.Format("{0}/{1}", Settings1.Default.WebPhotosLocation, Path.GetFileName(f.FullName))), filePath);
}

不,没有必要。一旦GC收集到WebClient,所有事件处理程序都将为您清理。在GC发生之前,它们不会造成任何伤害,因为事件不可能触发,因此永远不会调用处理程序。

您应该手动处理它。@SriramSakthivel请详细说明您的评论好吗?它与什么有关?我的
WebClient
将通过using语句处理?至于事件处理程序,我无法处理您在异步操作完成(DownloadFileAsync)之前处理WebClient的事件,我不确定这样做是否合法。而且,如果事件处理程序指向某个实例方法,则在web客户端为GC'd之前,不会在
Dispose
上删除事件处理程序。好的,因此在我的实际示例中,我使用手动重置来确保在下载文件之前不会处理
WebClient
。匿名方法是否算作实例方法?我本以为调用
Dispose
会导致
WebClient
成为垃圾collected@user1如果使用事件等待异步操作完成,那么首先使用异步IO有什么意义?此外,Dispose不与GC交互。它只是急切地释放资源。