У меня есть Canvas
с большим количеством небольшого холста внутри. Если я нажму на любой из них, он создаст Thread
с определенным методом (добавьте еще один маленький холст к основному холсту и передвигайтесь по нему, например). Мне нужно сделать некоторые из этих маленьких холстов, когда я нажимаю на определенную кнопку. Так что я попытался с foreach
цикла, но аварий приложений и показывает мне эту ошибку:C# Wpf Foreach InvalidOperationException Многопоточность
InvalidOperationException: Collection was modified; enumeration operation may not execute
Я думал, что происходит, потому что было переключение контекста, поэтому я добавил замок к методу, но проблема по-прежнему. Мой код ниже:
private void BacteriaPsiEspecial(object sender , MouseButtonEventArgs e)
{
lock (sender)//Maybe here is the problem
{
//The application crashes here
foreach (Canvas LittleCanvas in CanvasSimulador.Children)
{
if(LittleCanvas.Uid.Equals("SomeId"))
{
//Method to make each one grow growMethod()
}
}
}
}
Я не знаю, если foreach
работает, чтобы сделать это. Я должен использовать много потоков, потому что все маленькие полотна постоянно перемещаются по основному холсту. Вопрос в том, что я могу сделать, чтобы некоторые из этих холстов были затронуты growMethod()?
Если вы хотите получить какую-то коллекцию, она ожидает, что сбор не изменится (т.е. вы можете добавить или удалить из коллекции). Я предполагаю, что внутри вас 'growMethod()' он меняет то, что будет частью коллекции 'CanvasSimulador.Children'. Если вы не можете определить проблему самостоятельно, не могли бы вы отредактировать вопрос, чтобы включить код в 'growMethod()'? –
Я могу включить код, но я думаю, что это не поможет. Если я поставлю вместо growMethod MessageBox. Показать («Привет»); проблема продолжается. Другие методы, связанные с другими потоками, меняют коллекцию. –