WebClient.DownloadString多次完成激发

本文关键字:DownloadString WebClient | 更新日期: 2023-09-27 18:28:47

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

 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是一个网络客户端。在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";
 }));

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

在使用不同的url运行两次网络客户端后,它返回:

  • 原理
  • 星际
  • 星际

和三个不同的网址:

  • 原理
  • 星际
  • 星际
  • 《星球大战:第七集》
  • 《星球大战:第七集》
  • 《星球大战:第七集》

WebClient.DownloadString多次完成激发

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

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

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