C# 我可以在呼叫后重新初始化webclient吗?

C# 我可以在呼叫后重新初始化webclient吗?,c#,windows-phone-7,windows-phone-8,garbage-collection,webclient,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.DownloadStringA

下面是一个假设的例子:

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_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
}

与这个问题类似:


在本例中,发布者wc的垃圾收集似乎没有受到影响。wc包含对事件处理程序的引用,但没有任何内容包含对wc的引用。

我想他指的是一个队列处理程序,用于下载字符串并跟踪每个下载到队列中的内容。是的,我只是想检查WebClient是否忙。如果是,则将调用粘贴到堆栈上。客户端完成后,将其弹出并运行。这本身就是一个简单的解决方案。但是,返回类型的处理需要非常不同,因此每个返回类型都需要大量自定义代码。@AMR为什么要使用相同的WebClient?只需创建一个,下载一些东西并处理它。这有什么不对?您也可以将任务/线程与创建自己的WebClient一起使用。@I4V其复杂性。。。lol Id宁愿不进入应用程序,但有很好的理由说明它是以这种方式构造的。我只想停止并发调用的附带情况。@AMR好的,但我真的想听听
它以这种方式构造的好理由。
在这种情况下,wc是事件发布者。无论根据wc的事件注册了多少个事件处理程序,都是wc持有对订阅者的引用。没错,wc持有引用。GC不关心一个对象有多少引用,只关心该对象有多少引用。所以我不怕说这是一个很好的答案,但有点过头了。他是说,如果您的发布者(本例中为wc)持有对事件处理程序的引用,那么它将在事件被收集后执行该引用?除了WebClient的内部结构之外,没有任何东西可以阻止wc在事件被触发之前被收集。如果DownloadStringAsync创建了对webclient的内部引用,那么它可能会保持活动状态足够长的时间以触发事件。因此,当您说“可能保持活动状态”时,这是否意味着它有可能会保留引用并仍然被处置?下载{Action}Async方法在内部对webclient进行了许多引用,但这些引用属于未记录实现的领域。据我所知,WebClient上相当复杂的异步请求方法的内部将包含对WebClient的引用。如果创建WebClient并进行异步调用,它应该通过自己的内部对象和引用保持活动状态。但是,这依赖于框架类的内部实现始终具有相同的副作用。