WebClient.DownloadStringCompleted多次触发?

时间:2014-11-03 03:14:23

标签: c#

所以现在,按下按钮,我有这个:

 wc.DownloadStringCompleted += wc_DownloadStringCompleted;
 wc.DownloadProgressChanged += wc_DownloadProgressChanged;

 Thread nT = new Thread(() => wc.DownloadStringAsync(new Uri("http://www.imdbapi.com/?i=" + movID + "&plot=full&r=json")));
 nT.Start();

wc是一个webclient。在wc_DownloadStringCompleted下我有这个:

 Dictionary<String, String> values = JsonConvert.DeserializeObject<Dictionary<String, String>>(e.Result);
 Movies.Add(CREATE_MOVIE(values));
 this.Invoke((MethodInvoker)(() => 
 {
     this.Text = "Add Multiple Movies";
 }));

然而,当webclient完成下载字符串时,它将运行有电影索引的次数。因此,例如,webclient第一次运行它将返回1个电影,然后下次webclient运行时,它将返回2部电影,总共3部电影,而应该只有两部。这是一个例子:

使用不同的网址运行webclient两次后,它返回:

  
      
  • 原则
  •   
  • 星际
  •   
  • 星际
  •   

还有三个不同的网址:

  
      
  • 原则
  •   
  • 星际
  •   
  • 星际
  •   
  • 星球大战:第七集
  •   
  • 星球大战:第七集
  •   
  • 星球大战:第七集
  •   

1 个答案:

答案 0 :(得分:0)

每次启动下载时,都会再次将...Completed...ProgressChanged处理程序订阅到同一对象。每次下载时,这会为每个事件添加一个新的订阅实例。因此,当引发事件时,会调用每个订阅,从而导致处理程序的多次调用(同样的事情发生在...Completed事件中,但是您处理事件的方式可能会阻止多次调用立即引起注意的问题)。

...Completed处理程序中的匿名方法更改为以下内容:

this.Invoke((MethodInvoker)(() => 
{
    this.Text = "Add Multiple Movies";
    wc.DownloadStringCompleted -= wc_DownloadStringCompleted;
    wc.DownloadProgressChanged -= wc_DownloadProgressChanged;
}));