集合已修改枚举操作不能执行线程安全c#
我在从一个列表创建一个要添加到listbox的线程时收到一个错误 这是代码集合已修改枚举操作不能执行线程安全c#,c#,multithreading,C#,Multithreading,我在从一个列表创建一个要添加到listbox的线程时收到一个错误 这是代码 private void textBoxSearch_TextChanged(object sender, EventArgs e) { listBoxSuggest.Items.Clear(); { string temp = ((TextBox)sender).Text; mythread = new Thread(()=> Up
private void textBoxSearch_TextChanged(object sender, EventArgs e)
{
listBoxSuggest.Items.Clear();
{
string temp = ((TextBox)sender).Text;
mythread = new Thread(()=> UpdateListBox(temp) );
mythread.Start();
}
}
private void UpdateListBox(string queyt)
{
if (queyt !=null)
{
if (myPrefixTree.Find(queyt))
{
var match = myPrefixTree.GetMatches(queyt);
foreach (string item in match)
this.Invoke((MethodInvoker)(() => listBoxSuggest.Items.Add(item)));
}
}
}
我收到一个错误
Collection was modified; enumeration operation may not execute.
我需要一个解决问题的方法
更新。。。
在运行程序时,我收到一个错误
foreach (string item in match)
问题是您调用了一些东西,例如.Add或.Remove,它在遍历枚举时编辑枚举的内容。这会导致迭代失败,因为现在不确定是继续处理新元素(可能在当前索引之前设置了索引)还是跳过旧元素(可能已经处理过,甚至可能是当前项) 您需要确保任何可能修改其调用的循环内容的循环都会迭代该枚举的副本。这两个服务器都能达到这个目的吗-
foreach(var item in collection.ToArray()) ...
-或-
foreach(var item in collection.ToList()) ...
这意味着当某些东西不可避免地调用
collection.Add
时,它会修改原始集合,而不是正在迭代的集合,从而防止出错。但是,这可能意味着它将处理在迭代早期删除的内容,在这种情况下,您可能需要更复杂的解决方案。问题是您调用了一些内容,例如.Add或.Remove,它在对枚举进行迭代时编辑枚举的内容。这会导致迭代失败,因为现在不确定是继续处理新元素(可能在当前索引之前设置了索引)还是跳过旧元素(可能已经处理过,甚至可能是当前项)
您需要确保任何可能修改其调用的循环内容的循环都会迭代该枚举的副本。这两个服务器都能达到这个目的吗-
foreach(var item in collection.ToArray()) ...
-或-
foreach(var item in collection.ToList()) ...
这意味着当某些东西不可避免地调用
collection.Add
时,它会修改原始集合,而不是正在迭代的集合,从而防止出错。但是,这可能意味着它将处理在迭代早期删除的内容,在这种情况下,您可能需要更复杂的解决方案。问题是您调用了一些内容,例如.Add或.Remove,它在对枚举进行迭代时编辑枚举的内容。这会导致迭代失败,因为现在不确定是继续处理新元素(可能在当前索引之前设置了索引)还是跳过旧元素(可能已经处理过,甚至可能是当前项)
您需要确保任何可能修改其调用的循环内容的循环都会迭代该枚举的副本。这两个服务器都能达到这个目的吗-
foreach(var item in collection.ToArray()) ...
-或-
foreach(var item in collection.ToList()) ...
这意味着当某些东西不可避免地调用
collection.Add
时,它会修改原始集合,而不是正在迭代的集合,从而防止出错。但是,这可能意味着它将处理在迭代早期删除的内容,在这种情况下,您可能需要更复杂的解决方案。问题是您调用了一些内容,例如.Add或.Remove,它在对枚举进行迭代时编辑枚举的内容。这会导致迭代失败,因为现在不确定是继续处理新元素(可能在当前索引之前设置了索引)还是跳过旧元素(可能已经处理过,甚至可能是当前项)
您需要确保任何可能修改其调用的循环内容的循环都会迭代该枚举的副本。这两个服务器都能达到这个目的吗-
foreach(var item in collection.ToArray()) ...
-或-
foreach(var item in collection.ToList()) ...
这意味着当某些东西不可避免地调用
collection.Add
时,它会修改原始集合,而不是正在迭代的集合,从而防止出错。但是,这可能意味着它将处理在迭代早期删除的内容,在这种情况下,您可能需要更复杂的解决方案。该错误来自哪行代码?这里发生了一些其他的事情,你可能在一个列表中循环,并且在这个循环中;您正在从该列表中删除/添加项目。这在这段代码中似乎没有发生。错误出现在哪里?错误来自哪一行代码?这里发生了一些其他的事情,你可能在一个列表中循环,并且在这个循环中;您正在从该列表中删除/添加项目。这在这段代码中似乎没有发生。错误出现在哪里?错误来自哪一行代码?这里发生了一些其他的事情,你可能在一个列表中循环,并且在这个循环中;您正在从该列表中删除/添加项目。这在这段代码中似乎没有发生。错误出现在哪里?错误来自哪一行代码?这里发生了一些其他的事情,你可能在一个列表中循环,并且在这个循环中;您正在从该列表中删除/添加项目。这在这段代码中似乎没有发生。错误出现在哪里?