Entwickler-Ecke

WPF / Silverlight - MultiThreading MVVM


cjoksch - Di 16.09.14 13:18
Titel: MultiThreading MVVM
Hallo,
ich erprobe gerade meine Kenntnisse in C# und stosse schon an meine Grenzen.
Ich erstelle 2 Threads:

C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
ThreadStart bstart = delegate { GetItems(_textBlockOldInstallPath, "OLD"); };
Thread bThread = new Thread(new ThreadStart(bstart));
bThread.SetApartmentState(ApartmentState.STA);
bThread.Start();

ThreadStart astart = delegate { GetItems(_textBlockNewInstallPath, "NEW"); };
Thread aThread = new Thread(new ThreadStart(astart));
aThread.SetApartmentState(ApartmentState.STA);
aThread.Start();

danach möchte ich in ein anderes TabItem Wechseln was mit dem Fehler:
Der aufrufende Thread kann nicht auf dieses Objekt zugreifen, da sich das Objekt im Besitz eines anderen Threads befindet.

Was muss ich da ändern ??

danke
Cay

Moderiert von user profile iconTh69: C#-Tags hinzugefügt


Th69 - Di 16.09.14 15:27

Hallo und :welcome:

wenn du WPF (und MVVM) verwendest, dann darfst du Zugriffe auf die UI nur aus dem Hauptthread (GUI-Thread) heraus durchführen.

Um Zugriffe auf UI-Elemente aus Threads heraus zu ermöglichen, gibt es die Dispatcher [http://msdn.microsoft.com/en-us/library/system.windows.threading.dispatcher%28v=vs.110%29.aspx]-Klasse und dessen BeginInvoke bzw. Invoke-Aufrufe, s.a. den Beitrag (sowie den dortigen Link) WPF User Control aus einem Thread an den Hauptthread binden [http://www.entwickler-ecke.de/viewtopic.php?p=688276#688276].

Btw: Statt eigener Threads solltest du besser die in .NET 4.0 eingeführte Task-Klasse bzw. die ab .NET 4.5 neuen Schlüsselwörter async und await verwenden, s.a. meinen Beitrag (sowie den Anhang) Threading - Threadsicherheit - Dictonary<T1,T2> - .NET 4.0 [http://www.entwickler-ecke.de/viewtopic.php?p=604486#604486]


cjoksch - Di 16.09.14 16:55

Hallo,
danke für die Info werde ich mich morgen gleich mit auseinandersetzen.

danke
Cay