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 » BackgroundWorker darf WPF-Form nicht verändern
Letzter Beitrag | Erster ungelesener Beitrag Druckvorschau | An Freund senden | Thema zu Favoriten hinzufügen

Antwort erstellen
Zum Ende der Seite springen  

BackgroundWorker darf WPF-Form nicht verändern

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

Dabei seit: 27.07.2011
Beiträge: 69


Kingkook ist offline

BackgroundWorker darf WPF-Form nicht verändern

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

Liebe Com,

ich für meine Form ein BackgroundWorker, der meine GUI nach und nach Transparent machen soll.Dafür habe ich ihm im Konstruktor der Klasse die nötigen Events angehängt.

C#-Code:
                taskbarWorker = new BackgroundWorker();
                taskbarWorker.DoWork += new DoWorkEventHandler(TaskbarDoWork);
                taskbarWorker.ProgressChanged += new ProgressChangedEventHandler(TaskbarChanged);
                taskbarWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(TaskbarCompleted);

Jetzt wartet die GUI darauf, von einer anderen Klasse ein Event zu erhalten.Wenn dieses Event gefeuert wird, wird der Worker gestartet.Er arbeitet sich normal durch, aber wenn er etwas an der GUI verändern soll, kommt eine InvalidOperationException.
Woran könnte das liegen?

Hier der BGW-Code:

C#-Code:
        private void TaskbarDoWork(object sender, DoWorkEventArgs e)
        {
            BackgroundWorker worker = sender as BackgroundWorker;
            worker.WorkerReportsProgress = true;
            for(int _opacity = 100 ; _opacity > 0 ; _opacity--)
            {
                worker.ReportProgress(_opacity);
                System.Threading.Thread.Sleep(100);
            }
            e.Result = e.Argument;
        }

        private void TaskbarChanged(object sender, ProgressChangedEventArgs e)
        {
            Logger.InfoWrite("Changed to {0}", e.ProgressPercentage);
            float newOpacity = (float)e.ProgressPercentage;
            this.volumeBar.Opacity = newOpacity;
        }

        private void TaskbarCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            Logger.InfoWrite("Completed");
        }

Danke im voraus... Kooki :-)
18.04.2012 08:41 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
DaMoe80 DaMoe80 ist männlich
myCSharp.de-Mitglied

Dabei seit: 10.07.2007
Beiträge: 474


DaMoe80 ist offline

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

18.04.2012 09:16 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Kingkook
myCSharp.de-Mitglied

Dabei seit: 27.07.2011
Beiträge: 69

Themenstarter Thema begonnen von Kingkook

Kingkook ist offline

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

Danke erstmal,
den Artikel habe ich vorher bereits gelesen aber folgenden Absatz so verstanden, dass es bei mir eigentlich gehen sollte.

Zitat:
BackgroundWorker

Statt mit extra Threads und Control.Invoke, kann man auch mit der BackgroundWorker-Klasse ungültige threadübergreifende Vorgänge vermeiden. Dazu müssen bei BackgroundWorker alle Zugriffe auf das GUI einfach aus den ProgressChanged- oder RunWorkerCompleted-EventHandlern durchgeführt werden. Wenn man sich daran hält, ist explizites Control.Invoke bei BackgroundWorker nicht erforderlich, denn die genannten EventHandler werden hinter den Kulissen automatisch per Control.BeginInvoke aufgerufen.

Alles vorausgesetzt, der BackgroundWorker wurde korrekt initialisiert, so dass er insbesondere einen passenden SynchronizationContext verwendet. Wenn der BGW unter Verwendung von VS im GUI-/Main-Thread erzeugt wurde, sollte das automatisch der Fall sein.

Meiner Meinung nach sollte es doch bei mir funzen, wenn der BGW bei Erstellung der WPF-Form initialisiert wird, und Events angehängt bekommt.Da ich die GUI-Manipulation erst im Changed Event ausführe, sollte doch alles stimmen oder?
18.04.2012 11:20 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
DaMoe80 DaMoe80 ist männlich
myCSharp.de-Mitglied

Dabei seit: 10.07.2007
Beiträge: 474


DaMoe80 ist offline

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

Hi Kingkook!

Es sollte automatisch funtionieren, wenn Du den BackgroudWorker im UI Thread erstellst. Das ist wichtig, dam der BGW bzw. der SynchronizationContext im BGW erkennt, ob zwischen den Threads "geswitcht" werden muss.

Zitat:
Jetzt wartet die GUI darauf, von einer anderen Klasse ein Event zu erhalten.Wenn dieses Event gefeuert wird, wird der Worker gestartet.

In welchem Thread wird der BGW initialisiert?

By the way: Du brauchst in der Methode TaskDoWork nicht immer das Property WorkerReportsProgress auf true setzen. Das genuegt initial einmal bei Erstellung des BGW.

Gruss,
DaMoe
18.04.2012 12:06 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
FZelle
myCSharp.de-Poweruser/ Experte

Dabei seit: 23.04.2004
Beiträge: 8.478


FZelle ist offline

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

@Kingkook:
Sobald Thread.Sleep im BGW zum Einsatz kommt, ist es meist die falsche Herangehensweise.

Für diese simple Funktion mit Threading zu arbeiten ist nicht nötig.
Erstelle einen Forms.Timer und mache das dadrin.

Und die Exception bekommst du weil du nicht geschaut hast welche Wertebereiche Opacity hat.
18.04.2012 12:59 Beiträge des Benutzers | zu Buddylist hinzufügen
Kingkook
myCSharp.de-Mitglied

Dabei seit: 27.07.2011
Beiträge: 69

Themenstarter Thema begonnen von Kingkook

Kingkook ist offline

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

@DaMoe80

Initialisiert wird er, wenn auch das WPF-Fenster initialisiert wird, jedoch wird er wie gesagt in einer Methode gestartet, welche von einem Event aufgerufen wurde.

@FZelle

Mit einem Timer habe ich es vorher getestet, hat aber nicht funktioniert :-(
Mit dem Wertebereich kann es aber nichts zu tun haben, der wird erstens eingehalten und ausserdem funktioniert die ganze BGW Geschichte auch, wenn ich zB direkt bei der Initialisierung RunWorkerAsynch() aufrufe.Nur wenn ich diesen Startin einem Event aufrufe, kommt die Fehlermeldung...

Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Kingkook am 18.04.2012 16:27.

18.04.2012 14:08 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Briefkasten Briefkasten ist männlich
myCSharp.de-Mitglied

images/avatars/avatar-1523.gif


Dabei seit: 07.04.2004
Beiträge: 420
Entwicklungsumgebung: Visual Studio Express 2005


Briefkasten ist offline

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

Hallo,

du könntest auch probieren das Fenster mit einer Animation langsam transparent zu machen.
19.04.2012 13:50 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
FZelle
myCSharp.de-Poweruser/ Experte

Dabei seit: 23.04.2004
Beiträge: 8.478


FZelle ist offline

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

Zitat:
Mit dem Wertebereich kann es aber nichts zu tun haben, der wird erstens eingehalten

Da Opacity ein Float im bereich 0-1 ist, kann das nicht sein.

Zitat:
Mit einem Timer habe ich es vorher getestet, hat aber nicht funktioniert :-(

Dann hast du nicht den richtigen Timer genommen, gibt da nämlich 3 von.
Und funktioniert nicht ist keine vernünftige Fehlerbeschreibung.

Zitat:
.Nur wenn ich diesen Startin einem Event aufrufe, kommt die Fehlermeldung...

Dann hast Du uns verschwiegen aus was für einem Event das kommt.
19.04.2012 14:03 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.
Antwort erstellen


© Copyright 2003-2013 myCSharp.de-Team. Alle Rechte vorbehalten. 19.05.2013 05:43