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