这是一个假设的例子:
WebCleint wc = new WebClient();
wc.DownloadStringCompleted += wc_DownloadStringCompleted;
wc.DownloadStringAsync(new Uri(callString));
wc = new WebClient();
wc.DownloadStringCompleted += wc_DownloadStringCompleted;
wc.DownloadStringAsync(new Uri(callString));
根据我的理解,垃圾收集器不会抓住东西,直到完全取消引用。所以我想我的真实问题是,事件注册是否算作对象的引用?
我是否可以进行此调用并通过相同的已完成方法返回两个回传?
我可以进行许多不同的网络通话。他们都需要完成异步。它们都可以随机发生。
现在我只是假设我构建它的方式可以防止并发调用,但这是构建东西的坏方法哈哈。
我试图避免创建堆栈队列。
答案 0 :(得分:1)
每个事件注册都会使对象(WebClient)保持活动状态,除非您释放当前实例(包含wc_DownloadStringCompleted的实例)。您可以在wc_DownloadStringCompleted中取消注册该事件。要在wc_DownloadStringCompleted中获取原始WebClient,请使用sender对象。
public void wc_DownloadStringCompleted(object sender, EventArgs e)
{
WebClient wc = (WebClient)sender;
wc.DownloadStringCompleted -= wc_DownloadStringCompleted;
// handle download completed
}
答案 1 :(得分:1)
与此问题类似:
Do event handlers stop garbage collection from occurring?
在这种情况下,发布商wc似乎没有影响他们的垃圾收集。 wc保存对事件处理程序的引用,但没有任何内容包含对wc的引用。