Ich bin gerade dabei ein Programm von c# 7.3 auf 8.0 upzugraden, dabei bin ich über eine Codepassage gestolpert in der Eigenschaften eines ListItems über einen neben Thread geändert werden. Erwartet hätte ich eine InvalidOperationException aber das ganze funktioniert erstaunlicherweise.
Die Methode erstellt dabei ein Array der zu bearbeiteten Items hierzu werden diese zunächst mittels Linq.Cast umgewandelt und anschließend mit Linq.ToArray in ein Array gepackt. Ich hab ein kleines Testprojekt erstellt das dass Verhalten reproduziert.
Die Methode die das Verhalten reproduziert sieht so aus:
Jetzt Frage ich mich und euch wie ist das Möglich?
PS: Ein bereinigte C# Projektmappe mit dem Testprojekt hab ich auch angehängt.
Die Methode erstellt dabei ein Array der zu bearbeiteten Items hierzu werden diese zunächst mittels Linq.Cast umgewandelt und anschließend mit Linq.ToArray in ein Array gepackt. Ich hab ein kleines Testprojekt erstellt das dass Verhalten reproduziert.
Die Methode die das Verhalten reproduziert sieht so aus:
C#-Quellcode
- private async void ColorLvItemsRandomize()
- {
- Random rnd = new Random();
- KnownColor[] colors = (KnownColor[])Enum.GetValues(typeof(KnownColor));
- ListViewItem[] items = ListView1.Items.Cast<ListViewItem>().ToArray();
- await Task.Factory.StartNew(() =>
- {
- foreach (ListViewItem item in items)
- {
- int index = rnd.Next(0, colors.Length - 1);
- item.BackColor = Color.FromKnownColor(colors[index]); // Spätestens hier sollte doch eine InvalidOperationException fliegen.
- }
- });
- }
Jetzt Frage ich mich und euch wie ist das Möglich?
PS: Ein bereinigte C# Projektmappe mit dem Testprojekt hab ich auch angehängt.