打电话后我可以重新初始化一个webclient吗?

时间:2013-08-10 23:59:28

标签: c# windows-phone-7 windows-phone-8 garbage-collection webclient

这是一个假设的例子:

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));

根据我的理解,垃圾收集器不会抓住东西,直到完全取消引用。所以我想我的真实问题是,事件注册是否算作对象的引用?

我是否可以进行此调用并通过相同的已完成方法返回两个回传?

我可以进行许多不同的网络通话。他们都需要完成异步。它们都可以随机发生。

现在我只是假设我构建它的方式可以防止并发调用,但这是构建东西的坏方法哈哈。

我试图避免创建堆栈队列。

2 个答案:

答案 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的引用。