为什么我的事件处理程序触发两次?

嘿家伙我有一个艰难的时间试图解决这个问题我已经在3小时仍然无法找出为什么它这样做…这里是代码

private void Catagory_SelectionChanged(object sender, SelectionChangedEventArgs e) { int selectedCategoryId = categoryIdList[categoryListBox.SelectedIndex]; client.GetItemsAsync(selectedCategoryId); client.GetItemsCompleted += new EventHandler(client_GetItemsCompleted); } void client_GetItemsCompleted(object sender, GetItemsCompletedEventArgs e) { itemIdList.Clear(); itemNameList.Clear(); itemNumberList.Clear(); itemDisplayList.Clear(); //Clears the Display List Items if (e.Error == null) { itemIdList = e.ItemIDList; itemNumberList = e.itemNumber; itemNameList = e.Result; for (int i = 0; i < itemIdList.Count; i++) { itemDisplayList.Add(new ItemDisplay { itemNumber = itemNumberList[i], itemName = itemNameList[i] }); } //Populating the listbox controll with the itemDisplaylist... Items.ItemsSource = itemDisplayList; } else { MessageBox.Show("Problem in getting the items list."); } } 

当我第一次完美地改变类别时……完美地说我的意思是它调用函数GetItemsAsync(selectedCategoryId)并抓取结果并调用事件处理程序client_GetItemsCompleted()并且事件处理程序的内部工作原理就像它一样应该,它设置列表与适当的数据,并在列表框中显示itemNumber和itemName …但是当我再次更改类别以获得不同的项目时,它无法正常工作,它正在做的是它清除列表并按预期填充列表,运行for循环并填充名为Items的listBox但由于某种原因它再次进入函数顶部并清空所有列表:/ …请告诉我为什么它再次执行该function..当我再次选择另一个类别时,它执行事件处理程序3次,然后执行4次等等..任何人都知道它为什么这样做? 我需要这个修复我的项目:(

每次执行此操作:

  client.GetItemsCompleted += 

您为该事件添加了一个订阅者,因此第二次它将触发两次(第三次三次,等等)。

在已完成的方法中unsubscrice( – =):

 void client_GetItemsCompleted(object sender, GetItemsCompletedEventArgs e) { try { /* .... */ } finally { client.GetItemsCompleted -= new EventHandler(client_GetItemsCompleted); } } 

或在每次通话前启动客户端对象。

 var client = new ...(); client.GetItemsAsync(selectedCategoryId); client.GetItemsCompleted += new EventHandler(client_GetItemsCompleted);