Entwickler-Ecke

C# - Die Sprache - Probleme mit Backgroundworker -> andere Klasse.


mr tobo - Mo 12.10.09 21:57
Titel: Probleme mit Backgroundworker -> andere Klasse.
Hallo zusammen.

In meinem Form1.cs erstelle ich einen Backgroundworker:

C#-Quelltext
1:
2:
3:
4:
                        BackgroundWorker BGW = new BackgroundWorker();
                        BGW.DoWork += new DoWorkEventHandler(BGW_DoWork);
                        BGW.RunWorkerCompleted += new RunWorkerCompletedEventHandler(BGW_RunWorkerCompleted);
                        BGW.RunWorkerAsync(str);



C#-Quelltext
1:
2:
3:
4:
5:
6:
        void BGW_DoWork(object sender, DoWorkEventArgs e)
        {
            BackgroundWorker bw = sender as BackgroundWorker;
            string str = e.Argument.ToString();
            Angriffsbrowser A = new Angriffsbrowser(str.ToString().Split('#')[0], str.ToString().Split('#')[1], str.ToString().Split('#')[2], str.ToString().Split('#')[3], str.ToString().Split('#')[4], str.ToString().Split('#')[5]);
        }

Die Klasse Angriffsbrowser ist eine selbst erstellte Klasse.
Bei der Kopfzeile des Konstruktors wirft mir der Compiler dann eine ThreadStateexception.
Fehlertext:
Zitat:
Das ActiveX-Steuerelement 8856f961-340a-11d0-a96b-00c04fd705a2 kann nicht instanziiert werden, da der aktuelle Thread kein Singlethread-Apartment ist.


Diesen Feher hatte ich auch schon früher. Durch etwas Recherche im Internet hab ich dann herausgefunden, dass ich den fehler durch das [STATHREAD]-Flag verhindern kann, wenn ich es über die Methode setze.
Ich schaffe es allerdings nicht, das flag für eine ganze Klasse zu setzen, und wenn ich es direkt über dem Konstruktor platziere, meldet der Compiler auch einen Fehler, weil der Konstruktor keine normale Methode ist.
Ich frage mich jetzt, wie ich denn die ganze Klasse als SingleThreadApartment setze.
Weiss jemand die Antwort?

Wenn es etwas bringt, hier auch noch die Ausnahmedetails:
Zitat:
System.Threading.ThreadStateException wurde nicht von Benutzercode behandelt.
Message="Das ActiveX-Steuerelement 8856f961-340a-11d0-a96b-00c04fd705a2 kann nicht instanziiert werden, da der aktuelle Thread kein Singlethread-Apartment ist."
Source="System.Windows.Forms"
StackTrace:
bei System.Windows.Forms.WebBrowserBase..ctor(String clsidString)
bei System.Windows.Forms.WebBrowser..ctor()
bei Timer.Angriffsbrowser..ctor(String _Angriffszzeit, String villageID, String _targetX, String _targetY, String _Units, String _Type) in F:\Tools\Projekte\Ds-Cheat\Ds-Timer\Timer\Timer\Angriffsbrowser.cs:Zeile 25.
bei Timer.Form1.BGW_DoWork(Object sender, DoWorkEventArgs e) in F:\Tools\Projekte\Ds-Cheat\Ds-Timer\Timer\Timer\Form1.cs:Zeile 161.
bei System.ComponentModel.BackgroundWorker.OnDoWork(DoWorkEventArgs e)
bei System.ComponentModel.BackgroundWorker.WorkerThreadStart(Object argument)
InnerException:


mit freundlichen Grüssen
mr tobo


Kha - Di 13.10.09 00:08

Du kannst Controls nur im Hauptthread erstellen/manipulieren, dafür bringt dir Multithreading überhaupt nichts. Was hast du denn vor?


mr tobo - So 18.10.09 19:54

Etwas im Sinne eines hitfakers, nur harmloser.
Für jeden Button-Click wird eine bestimmte webseite 1-mal aufgerufen.
Drückt man den button kurz hintereinander 10 mal, sollte 10 mal die webseite aufgerufen werden.
Falls die Webseite jedoch recht ressourcenlastig ist, ist das Program darauf böse am hängen.
Ich dachte ich erstelle für jeden Button click einen neuen Thread in dem ich dann je einen seitenaufruf starte.

Das scheint also so nicht umsetzbar zu sein.


funcry - Mo 19.10.09 12:47

Ob die von Kha genannte Einschränkung auch für eigene Prozesse gilt ? Vielleicht wäre das ein Ansatz.


Kha - Mo 19.10.09 15:43

user profile iconmr tobo hat folgendes geschrieben Zum zitierten Posting springen:
Etwas im Sinne eines hitfakers, nur harmloser.
Gut, ich gehe mal von "harmlosen" Bewegungsgründen aus ;) . Wenn du nur mehrere Requests an eine Seite schicken willst, dann brauchst du dafür doch keinen Browser zum Anzeigen, sondern es genügt die WebClient-Klasse, die auch asynchrone Requests unterstützt.


mr tobo - Mo 19.10.09 17:13

Ist es mit derm WebRequest-Klasse möglich, einen Button zu drücken?
Sollte nämlch auf der Sete noch ein Button gedrückt werden...
bs jetzt habe ich das über Webbrowser.Document mit der Invoke-methode gelöst...