下面是一个假设的例子:
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));
根据我的理解,垃圾收集器在完全取消引用之前不会抓取某个东西。所以我想我真正的问题是,事件注册是否算作对对象的引用?
我可以进行这个调用并通过相同的已完成方法返回两个返回吗?
我有很多不同的网络电话可以拨打。它们都需要异步完成。它们都可能在随机时间发生。
现在我只是觉得我构建它的方式可以防止并发调用,但这是一种糟糕的构建方式,哈哈。
我试图避免创建堆栈队列。
类似于这个问题:
事件处理程序是否阻止垃圾收集的发生?
在这种情况下,发布者(wc)的垃圾收集似乎没有受到影响。wc包含对事件处理程序的引用,但没有任何内容包含对wc的引用。
除非释放当前实例(包含wc_DownloadStringCompleted的实例),否则每个事件注册都会使对象(WebClient)保持活动状态。您可以在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
}