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运行两次网络客户端后,它返回:
- 原理
- 星际
- 星际
和三个不同的网址:
- 原理
- 星际
- 星际
- 《星球大战:第七集》
- 《星球大战:第七集》
- 《星球大战:第七集》
每次启动下载时,都会将...Completed
和...ProgressChanged
处理程序再次订阅到同一对象。这会在每次下载时为每个事件添加一个新的订阅实例。因此,当引发事件时,每个订阅都会被调用,从而导致对处理程序的多次调用(...Completed
事件也会发生同样的情况,但处理事件的方式可能会阻止多次调用问题立即出现)。
将...Completed
处理程序中的匿名方法更改为以下内容:
this.Invoke((MethodInvoker)(() =>
{
this.Text = "Add Multiple Movies";
wc.DownloadStringCompleted -= wc_DownloadStringCompleted;
wc.DownloadProgressChanged -= wc_DownloadProgressChanged;
}));