我可以在调用后重新初始化网络客户端吗



下面是一个假设的例子:

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
}

最新更新