Entwickler-Ecke

Sonstiges (.NET) - Form in eigenen Thread packen


ebber - Do 25.12.08 15:25
Titel: Form in eigenen Thread packen
Hallo,

ich möchte ein neues Fenster erstellen, welches in einem eigenen Thread laufen soll. Ich habe das mal so versucht:


C#-Quelltext
1:
2:
        Thread thr = new Thread(new ThreadStart(dosth));
        thr.Start();



C#-Quelltext
1:
2:
3:
4:
5:
        public void dosth()
        {
            Window2 win = new Window2();
            win.Show();
        }


Fast häts geklappt :) . Es meinte allerdings, es müsse ein STA Thread sein. Dann bin ich auf diese Zeile gestoßen:


C#-Quelltext
1:
thr.TrySetApartmentState(ApartmentState.STA);                    


Dadurch kam der Fehler:

Quelltext
1:
2:
3:
Additional Information: Eine verwaltete Ausführung wird innerhalb der Sperre für den OS-Loader versucht. 
Versuchen Sie nicht, verwalteten Code innerhalb einer DllMain- oder Bildinitialisierungsfunktion auszuführen, 
da dies ein Hängen der Anwendung zur Folge haben kann.


Ich kenne mich mit Threading relativ wenig aus. Funktioniert das überhaupt was ich vor habe? Es soll praktisch diese Form nicht blockieren, wenn die Main Form eventuell blockiert wird.

// Ist eine WPF Form (weis nicht ob das wichtig ist)

MfG


Christian S. - Do 25.12.08 15:27

Ich glaube, die wichtigste Frage ist erst einmal, warum Du das überhaupt tun willst. Es ist, soweit ich weiß, völlig unüblich die GUI in einen anderen Thread zu packen. Die Hintergrund-Prozesse, die macht man oft in andere Threads. Aber eine die GUI selber :gruebel:

Die Frage ist doch sowieso, was mit der GUI passiert, wenn der Thread fertig ist (also Deine Methode durchgelaufen). Die dürfte da doch eigentlich "entsorgt" werden.


ebber - Do 25.12.08 15:39

Deiner Antwort entnehme ich mal, dass ich besser darauf schauen sollte, dass meine Main Form nicht blockiert. Das ist leider etwas schwierig, deshalb auch die ganze Idee.

Dass der Thread irgendwann mal fertig ist und meine Form dann "entsorgt" wird, daran hatte ich nicht so direkt gedacht.

Dann muss ich das wohl ein wenig komplizierter lösen.


Christian S. - Do 25.12.08 15:44

Du kannst auch einfach mal erkären, wo das eigentliche Problem liegt, dann kann man vielleicht eine bessere Lösung finden :-)


ebber - Do 25.12.08 15:50

Im Prinzip habe ich das am Anfang schon gesagt. Meine 2. Form soll nicht blockieren wenn die Main Form blockiert.

Auf der 2. Form sind einige Bedienelemente (buttons...), diese soll man immer benutzen können. Das Problem ist, dass die Main Form ab und zu mal wieder für ein paar sek hängt. Das aber wiederum an einigen verschiedenen Stellen. Ich müsste da also einige Funktionen in einen Backroundworker oder sowas packen.

Deshalb dachte ich es ist einfacher ich packe einfach die andere Form in einen anderen Thread.

Die andere Lösung ist eben ein wenig umständlicher, aber immer noch akzeptabel und so wie mir scheint die eindeutig schönere.

MfG


JüTho - Do 25.12.08 16:05

user profile iconebber hat folgendes geschrieben Zum zitierten Posting springen:
Die andere Lösung ist eben ein wenig umständlicher, aber immer noch akzeptabel und so wie mir scheint die eindeutig schönere.

Genauso ist es.

Zusatzhinweis: Wenn Aufgaben aus dem MainForm länger dauern und ggf. blockieren, dann muss man sich damit befassen und nicht mit irgendeinem Ersatzverfahren, das mit dem Problem überhaupt nichts zu tun hat.

Gruß und Frohe Weihnachten! Jürgen


ebber - Do 25.12.08 16:14

Zitat:

dann muss man sich damit befassen und nicht mit irgendeinem Ersatzverfahren

Da muss ich dir im Prinzip ausnahmslos zustimmen.

Als ich allerdings bei mir den Aufwand mit dem Ergebnis und für was es gut ist abgewägt hatte, dann war mir in diesem Moment doch eine schnellere Lösung lieber. :oops:

Zitat:

Gruß und Frohe Weihnachten!


Gleichfalls. Und auch an alle Anderen.