Bonjour,

J'ai une erreur qui fait planter mon application "La collection a été modifiée, L’opération d'énumération peut ne pas s’exécuter"

Je cherche depuis déjà 3 semaines sans trouver de solutions, par contre j'ai réussi a localiser la source, une routine qui sert a mettre jour une Liste d'alarme.

Mon application tourne 24h sur 24 le plantage est aléatoire, des fois après 1h ou 1 journée...

Je m'explique:

-J'ai un automate brancher via un câble Ethernet a mon PC. Qui récupéré des alarmes.

-Mon logiciel récupère les alarmes est les affiches dans une listview.

J'ai une routine qui fait le traitement des alarmes:

Cette routine s’exécute toute les secondes:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
Private Sub GestionAlarme()
 
Dim ListEtatAlarmeFichier As List(of EtatAlarme) = New List(of EtatAlarme)
Dim ListEtatAlarmeAutomate As List(of EtatAlarme) = New List(of EtatAlarme)
 
 
' Je rempli ma ListEtatAlarmeFichier <-- Lecture de Ma base de donnée binaire fait maiso
' Je rempli ma ListEtatAlarmeAutomate <-- Lecture des alarmes automate
 
'Je fait la comparaison des deux listes pour savoir les alarmes qui on changer d’état (Une alarmes a deux états 1 ou 0 actif ou non actif)
'en fonction du changement d’état je viens modifier ma base de données binaire pour historiser mes alarmes avec leurs date d'apparition et de disparition
 
'Juste que la tout va bien
 
'Voici la partie qui pose probléme: (si je la met en commentaire je n'est pas de plantage)
 
''''''''''Debut Creation de la list d'alarme actif'''''''''''''''''
                If Not (ListEtatAlarmeAutomate.Count = Nothing) Then 'Verification que la lsite ne soit pas vierge
                    ListeAlarmeActif = New WpfObservableCollection(Of LogAlarme)
                    Dim alarmeactif As LogAlarme
                    'ListeAlarmeActif.Clear()
                    For Each element As EtatAlarme In ListEtatAlarmeAutomate
                        If (element.etat = True) Then   'seulement si l'alarmes et active
                            alarmeactif = New LogAlarme
                            alarmeactif.id = element.id
                            theConfig = ConfigMgt.GetInstance()     'Lance l'instance pour faire la lecture de l'XML
                            For Each def As DefautAutomate In theConfig.Defauts
                                If (element.id = def.Id) Then
                                    alarmeactif.defaut = def.Description    'Charge le nom du defaut
                                End If
                            Next
                            ListeAlarmeActif.Add(alarmeactif)
                        End If
                    Next
                End If
                ''''''''''Fin Creation de la list d'alarme actif'''''''''''''''''

Voici la déclaration de ma ListeAlarmeActif:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
Public Property ListeAlarmeActifValue As WpfObservableCollection(Of LogAlarme)  ' Liste des alarmes active 'wpf
    Public Property ListeAlarmeActif As WpfObservableCollection(Of LogAlarme) 'wpf
        Get
            Return ListeAlarmeActifValue
        End Get
        Set(ByVal value As WpfObservableCollection(Of LogAlarme)) 'wpf
            ListeAlarmeActifValue = value
            NotifyPropertyChanged("ListeAlarmeActif")   'Mise a jour de la variable pour le binding
        End Set
    End Property

Cette ListeAlarmeActif est afficher dans un userControl qui est une simple listview, voici le code du control AlarmeActif

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Public Class AlarmeActifView
    Private Sub Grid1_Loaded() Handles MyBase.Loaded, ListView1.Loaded, Grid1.Loaded
        ThreadPool.QueueUserWorkItem(New WaitCallback(Function(state As Object)
                                                          Dim b As Binding = New Binding("ListeAlarmeActif")
                                                          b.Source = WatchAlarmeNew.ThreadWatchAlarmeNew()
                                                          MyBase.Dispatcher.BeginInvoke(Function()
                                                                                            ListView1.SetBinding(ListView.DataContextProperty, b)
 
 
                                                                                            Return (Nothing)
                                                                                        End Function)
                                                          Return Nothing
                                                      End Function))
    End Sub
End Class
Je continu de chercher, si quelqu'un peut me donner une piste pour résoudre mon probléme sa serait d'un grand renfort.

Merci.