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