Laden...

Cross thread Exception in Windows Forms

Erstellt von kantaki vor 12 Jahren Letzter Beitrag vor 12 Jahren 1.944 Views
Thema geschlossen
K
kantaki Themenstarter:in
21 Beiträge seit 2011
vor 12 Jahren
Cross thread Exception in Windows Forms

hallo,

ich habe heute versucht einen thread zu verlagern damit die GUI nicht mehr einfriert.

undzwar habe genau das selbe gemacht wie in diesem guide => Threading out tasks in a C#.NET GUI


 private void fileWatcher_Changed(object sender, System.IO.FileSystemEventArgs e)
        {


            if (System.IO.File.Exists(e.FullPath) == true)
            {
                Manager mgr = new Manager(e, handreader, txtLog, sl);
                //sl.Invoke(new MethodInvoker(mgr.test));
                //sl.Invoke(new MethodInvoker(mgr.test));
                Thread mgrThread = new Thread(new ThreadStart(mgr.output));
                mgrThread.Name = "ThreadSl";
                mgrThread.Start();
 
            }
        }
 public void output()
        {
            StringBuilder builder = new StringBuilder();
            foreach (PlayerController pc in fm.lPc)
            {
                Equity eq = new Equity(pc, 100f, 0.5f, 0.3f, 0.2f, fm.HeroName);
                pc.calcEquity();
                Equity newEq = new Equity(pc, 100f, 0.5f, 0.3f, 0.2f, fm.HeroName);
                if (newEq.getEquity(pc.getSeatByName(fm.HeroName)) != eq.getEquity(pc.getSeatByName(fm.HeroName)))
                    builder.Append("" + eq.getEquity(pc.getSeatByName(fm.HeroName)) + " / " + (newEq.getEquity(pc.getSeatByName(fm.HeroName)) - eq.getEquity(pc.getSeatByName(fm.HeroName))) + "   Result: +Ev with : " + ((eq.getEquity(pc.getSeatByName(fm.HeroName)) / ((newEq.getEquity(pc.getSeatByName(fm.HeroName))))) * 100 + "%\r\n"));
            }
            txtLog.Text = builder.ToString();
        }

Fehlermeldung:
Ungültiger threadübergreifender Vorgang: Der Zugriff auf das Steuerelement txtLog erfolgte von einem anderen Thread als dem Thread, für den es erstellt wurde

Ich habe mit den post auf msdn durchgelesen How to: Make Thread-Safe Calls to Windows Forms Controls

und ich werde aufjedenfall meinen code umschreiben.

trotzdem interessiert es mich warum es nicht funktioniert, denn bei Threading out tasks in a C#.NET GUI funktioniert es anscheinend und ich kann es einfach nicht nachvollziehen.

D
615 Beiträge seit 2009
vor 12 Jahren

Hallo Kantaki

Die Fehlermeldung sagt doch alles , nicht ?


 txtLog.Text = builder.ToString();

Darfst du nicht im "nicht GUI" Thread machen. Ansonsten musst du erst Invoken.
(dieser Satz erinnert mich an VB : NOT NOTHING !)

Beste Grüsse

Diräkt

A
764 Beiträge seit 2007
vor 12 Jahren

Hallo kantaki

Also hier in der FAQ gibts einen Artikel: [FAQ] Controls von Thread aktualisieren lassen (Control.Invoke/Dispatcher.Invoke)
Da steht eigendlich alles drinne, was du wissen musst.

Den Artikel auf CodeProject würde ich ignorieren. Ist imho nicht so der Stand der Technik.

Gruß, Alf

5.742 Beiträge seit 2007
vor 12 Jahren

undzwar habe genau das selbe gemacht wie in diesem guide

Damit hast du wohl so ziemlich eines der schlechtesten Tutorials in diesem Gebiet erwischt...

Siehe besser den genannten [FAQ] Warum blockiert mein GUI?

Hinweis von herbivore vor 12 Jahren

Das Verlagern der langlaufenden Aktionen in einen extra Thread ist nur die halbe Miete. Es verhindert das blockieren des GUIs (siehe [FAQ] Warum blockiert mein GUI?). Wenn du aus dem Thread auf das GUI zugreifen willst, musst du eben auch noch [FAQ] Controls von Thread aktualisieren lassen (Control.Invoke/Dispatcher.Invoke) beachten (die zweite Hälfte der Miete). Das verhindert Probleme beim ansonsten thread-übergreifenden Zugriff.

Insofern gibt es aber auch überhaupt keinen Widerspruch, zwischen dem CodeProject und dem MSDN-Artikel.

Thema geschlossen