gpt4 book ai didi

c# - 多个事件处理程序触发,为什么?

转载 作者:行者123 更新时间:2023-11-30 13:23:33 26 4
gpt4 key购买 nike

我很难解决这个问题。我已经待了 3 个小时了,但我仍然不明白为什么会这样。这是代码:

private void Catagory_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
int selectedCategoryId = categoryIdList[categoryListBox.SelectedIndex];

client.GetItemsAsync(selectedCategoryId);
client.GetItemsCompleted +=
new EventHandler<GetItemsCompletedEventArgs>(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 但由于某种原因,它再次转到函数的顶部并清空所有列表。请告诉我为什么它再次执行该功能?当我再次选择另一个类别时,它会执行事件处理程序 3 次,然后 4 次,依此类推。知道为什么要这样做吗?

最佳答案

每次执行时:

  client.GetItemsCompleted += 

您向事件添加订阅者,因此第二次将触发两次(第三次三次,等等)。

在完成的方法中取消订阅(-=):

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

或在每次调用前启动客户端对象。

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

关于c# - 多个事件处理程序触发,为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10768676/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com