myCSharp.de - DIE C# und .NET Community
Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

» Hauptmenü
myCSharp.de
» Startseite
» Forum
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Suche
   » Plugin für Firefox
   » Plugin für IE7
   » Gadget für Vista
» Regeln
» Wie poste ich richtig?
» Datenschutzerklärung
» wbb-FAQ

Mitglieder
» Liste / Suche
» Stadt / Anleitung dazu
» Wer ist wo online?

Angebote
» ASP.NET Webspace
» Bücher
» Zeitschriften
   » dot.net magazin
» Accessoires

Ressourcen
» .NET-Glossar
» guide to C#
» openbook: Visual C#
» openbook: OO
» .NET BlogBook
» MSDN Webcasts
» dotnetjob.de
» Search.Net

Team
» Kontakt
» Übersicht
» Wir über uns
» Bankverbindung
» Impressum

» Unsere MiniCity
MiniCity
» myCSharp.de Diskussionsforum
Du befindest Dich hier: Community-Index » Diskussionsforum » Entwicklung » GUI: WPF und Silverlight » Ereignis aus Thread heraus führt zu Exception beim Aktualisieren des GUIs
Letzter Beitrag | Erster ungelesener Beitrag Druckvorschau | An Freund senden | Thema zu Favoriten hinzufügen

geschlossen (weitere Infos)
Zum Ende der Seite springen  

Ereignis aus Thread heraus führt zu Exception beim Aktualisieren des GUIs

 
Autor
Beitrag « Vorheriges Thema | Nächstes Thema »
Akhanto
myCSharp.de-Mitglied

Dabei seit: 04.04.2012
Beiträge: 15


Akhanto ist offline

Ereignis aus Thread heraus führt zu Exception beim Aktualisieren des GUIs

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hi,
in einer Anwendung lasse ich in einem Thread Dateien kopieren. Immer wenn eine Datei kopiert wurde, wird ein Event gefeuert. Im Programm fange ich die ab und will damit einen Fortschrittsbalken aktualisieren (Zugriff auf zwei int Properties in der kopierenden Klasse).

In WPF ist es ja nun so, dass man Steuerelemente nur aus dem gleichen Thread heraus verändern kann. Da ich jedoch das Ereignis im MainWindow abfange und das Steuerelement eigentlich auch dort erstellt wird, erschließt sich mir mein folgendes Problem nicht.

Immer wenn er eine Datei fertig hat (also quasi sofort nach dem Start), wirft er eine Exception:

Fehlermeldung:
Der aufrufende Thread kann nicht auf dieses Objekt zugreifen, da sich das Objekt im Besitz eines anderen Threads befindet.

kopierschleife:

C#-Code:
                    foreach (FileInfo fi in Dateien)
                    {
                        if (!File.Exists(strPfad + strOrdnername + fi.Name))
                        {

                            intZahlDateienAktuell++;
                            intZahlDateienRest--;
                            intProzent = intZahlDateienAktuell / intZahlDateien * 100;
                            System.IO.File.Copy((Convert.ToString(fi.FullName)), strPfad + strOrdnername + fi.Name, true);

                            OnDateiKopiert(EventArgs.Empty);

                        }
                    }

Ereignisbehandlung:

C#-Code:
        private void objDA_DateiKopiert(Object objSender, EventArgs e)
        {
            progBarFortschritt.Value = objDA.propProzent;
        }

Ich habe irgendwie das Gefühl, dass ich hier nen logischen Denkfehler habe, aber ich komme einfach nicht dahinter.

vielen Dank
Akhanto

Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Akhanto am 25.04.2012 21:48.

25.04.2012 21:47 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
chilic
myCSharp.de-Poweruser/ Experte

Dabei seit: 12.02.2010
Beiträge: 1.183


chilic ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Wo die Methode ist (Main Window) hat nichts damit zu tun in welchem Thread sie läuft. Sie wird trotzdem von verschiedenen Threads aufgerufen und darf deswegen nicht auf das Element zugreifen.
Ich weiß nicht wie das mit WPF ist, unter WinForms gibt es Control.Invoke.
Googel einfach mal nach deiner Exception, da dürfte es genügend Erklärungen geben wie du einen Threadwechsel hinkriegst.
25.04.2012 21:58 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
nicky nicky ist männlich
myCSharp.de-Mitglied

Dabei seit: 25.08.2011
Beiträge: 121


nicky ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Du musst die Aufgabe an den Thread, der die Komponente erstellt hat, übergeben.

Stichwort: Invoke
25.04.2012 22:59 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
ujr
myCSharp.de-Poweruser/ Experte

Dabei seit: 24.11.2007
Beiträge: 1.593


ujr ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo,

Zitat von Akhanto:
Immer wenn er eine Datei fertig hat (also quasi sofort nach dem Start), wirft er eine Exception:

Vielleicht wird es Dich überraschen, aber Du bist nicht der erste mit diesem Problem. Darum beachte:
 [Hinweis] Wie poste ich richtig? 1.1 und
 [FAQ] Controls von Thread aktualisieren lassen (Control.Invoke/Dispatcher.Invoke)
26.04.2012 09:10 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Baumstruktur | Brettstruktur       | Top 
myCSharp.de | Forum Der Startbeitrag ist älter als ein Jahr.
Der letzte Beitrag ist älter als ein Jahr.
geschlossen (weitere Infos)


© Copyright 2003-2013 myCSharp.de-Team. Alle Rechte vorbehalten. 25.05.2013 23:20