0

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); 
} 
+0

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. –

Antwort

0

Sie eine WebRequest Klasse verwenden sollte, weil ich denke, Sie das wollen Inhalt statt eines interaktiven Browsers. Dies eliminiert die Verwendung einer Nachrichtenpumpe (Application.Run()) mit einem zusätzlichen Thread.

using System; 
using System.IO; 
using System.Net; 
using System.Text; 

namespace Examples.System.Net 
{ 
    public class WebRequestGetExample 
    { 
     public static void Main() 
     { 
      // Create a request for the URL.   
      WebRequest request = WebRequest.Create ("http://www.contoso.com/default.html"); 
      // If required by the server, set the credentials. 
      request.Credentials = CredentialCache.DefaultCredentials; 
      // Get the response. 
      HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 
      // Display the status. 
      Console.WriteLine (response.StatusDescription); 
      // Get the stream containing content returned by the server. 
      Stream dataStream = response.GetResponseStream(); 
      // Open the stream using a StreamReader for easy access. 
      StreamReader reader = new StreamReader (dataStream); 
      // Read the content. 
      string responseFromServer = reader.ReadToEnd(); 
      // Display the content. 
      Console.WriteLine (responseFromServer); 
      // Cleanup the streams and the response. 
      reader.Close(); 
      dataStream.Close(); 
      response.Close(); 
     } 
    } 
} 

SOURCE von Msdn

https://msdn.microsoft.com/en-us/library/system.net.webrequest%28v=vs.110%29.aspx?f=255&MSPPError=-2147217396

+1

das problem mit webclient ist, dass es roh html voller scripts. während Web-Browser löst alles und gibt ein viel besseres HTML-Ergebnis ... so will ich bei Webbrowser-Steuerelement bleiben.Ich versuche versuchen mit einem Dummy-Formular dann .... danke jeder und ich werde den Thread aktualisieren, sobald ich lösen Das Thema –