Ich habe eine Klasse erstellt, die das WebBrowser-Steuerelement zum Auskratzen einiger Textdaten verwendet. Sie wurde ursprünglich in einer Windows Forms-Anwendung ausgeführt sei eine Konsolenanwendung, um das zu tun, führe ich meine Klasse in einem Thread aus und setze sie in STA, dann innerhalb meiner Klasse instanziiere ich den WebBrowser auf normale Weise mit dem Schlüsselwort "new", mein Problem ist, wenn der Thread fertig ist, endet er nie wirklich, und ich endlose warten, wenn ich Thread.Join() verwende, und wenn ich Application.ThreadExit() benutze passiert nichts, also habe ich Thread.Abort() versucht, und dies wirft fortwährend Ausnahmen, meine Frage ist, was der richtige Weg ist Ausführen einer Klasse, die WebBrowser in einer Konsolenanwendung instanziieren muss.Konsolenanwendung: Ausführen eines WebBrowsers innerhalb einer Klasse, die in einem STA-Thread ausgeführt wird
Dies ist, wie ich Thread für meine Klasse zu erstellen:
var th = new Thread(() =>
{
var br = MyBrowsingClass;
br.NavigateTo(url);
System.Windows.Forms.Application.Run();
});
th.SetApartmentState(ApartmentState.STA);
th.Start();
return th;
und in meiner Klasse I wie folgt vor:
wb = new WebBrowser();
wb.ScriptErrorsSuppressed = true;
wb.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(OnWebComplete);
CurrentState = Status.Navigating;
if (IsValidURL(GoogleQueryURL))
{
wb.NavigateTo(GoogleQueryURL);
}
Das Problem mit 'Application.Run()' ist, dass es nur eine Instanz sein kann. Daher kann paralleles Retreiven von Inhalten nicht einfach durchgeführt werden. Sie können die 'Application.Run()' beenden, indem Sie 'Application.Exit()' aufrufen oder ein 'Dummy'-Formular erstellen und es an 'Application.Run (form1)' übergeben und es 'form1.Close()' schließen , aber wie ich unten angegeben habe, sollten Sie sich die 'WebRequest' Klasse ansehen. –