Autor Beitrag
mr tobo
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 40



BeitragVerfasst: Mo 12.10.09 21:57 
Hallo zusammen.

In meinem Form1.cs erstelle ich einen Backgroundworker:
ausblenden 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);


ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 40



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 110
Erhaltene Danke: 1

Win7 64, XP 32
C# (VS 2010 EE), Delphi (TD 2006 Win32)
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 40



BeitragVerfasst: 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...