Ich habe eine Liste von Uris, auf die ich "klicken" möchte. Um dies zu erreichen, versuche ich, ein neues Webbrowser-Steuerelement pro Uri zu erstellen. Ich erstelle einen neuen Thread pro Uri. Das Problem, das ich habe, ist das Thread-Ende vor dem Dokument ist vollständig geladen, sodass ich das DocumentComplete-Ereignis nie nutzen kann. Wie kann ich das überwinden?
var item = new ParameterizedThreadStart(ClicIt.Click);
var thread = new Thread(item) {Name = "ClickThread"};
thread.Start(uriItem);
public static void Click(object o)
{
var url = ((UriItem)o);
Console.WriteLine(@"Clicking: " + url.Link);
var clicker = new WebBrowser { ScriptErrorsSuppressed = true };
clicker.DocumentCompleted += BrowseComplete;
if (String.IsNullOrEmpty(url.Link)) return;
if (url.Link.Equals("about:blank")) return;
if (!url.Link.StartsWith("http://") && !url.Link.StartsWith("https://"))
url.Link = "http://" + url.Link;
clicker.Navigate(url.Link);
}
c#
multithreading
browser
Art W.
quelle
quelle
WebBrowser
Objekt am Leben erhalten (um Status / Cookies usw. zu speichern) und imNavigate()
Laufe der Zeit mehrere Anrufe tätigen. Ich bin mir jedoch nicht sicher, wo ich meinenApplication.Run()
Anruf tätigen soll, da dadurch die Ausführung von weiterem Code blockiert wird. Irgendwelche Hinweise?Application.Exit();
, umApplication.Run()
zurückkehren zu lassen .Hier erfahren Sie, wie Sie eine Nachrichtenschleife in einem Nicht-UI-Thread organisieren, um asynchrone Aufgaben wie die
WebBrowser
Automatisierung auszuführen . Es dientasync/await
zur Bereitstellung des bequemen linearen Codeflusses und lädt eine Reihe von Webseiten in einer Schleife. Der Code ist eine sofort einsatzbereite Konsolen-App, die teilweise auf diesem hervorragenden Beitrag basiert .Verwandte Antworten:
quelle
task.Wait();
. Ich mache etwas falschNach meiner Erfahrung in der Vergangenheit arbeitet der Webbrowser nicht gerne außerhalb des Hauptanwendungsthreads.
Versuchen Sie stattdessen, httpwebrequests zu verwenden. Sie können sie als asynchron festlegen und einen Handler erstellen, damit die Antwort weiß, wann sie erfolgreich ist:
How-to-Use-httpwebrequest-net-asynchron
quelle
webRequest.Credentials = CredentialsCache.DefaultCredentials;
Credentials
Objekteigenschaft zu tun ist und wie sie zu füllen ist das HTML.WindowsIdentity.GetCurrent().Name
nach der Implementierung des Identitätswechsels verwenden und bei Bedarf anhand einer AD-Suche testen. Ich bin mir nicht sicher, wie Cookies und Cache dafür verwendet werden sollen.WebBrowser
die Frage, welche darauf hinweisen würde, dass HTML-Seiten geladen werden. OP hat sogar gesagt, dass diesWebRequest
nicht das erreicht, was er will. Wenn eine Website HTML-Eingaben für die Anmeldung erwartet,Credentials
funktioniert das Festlegen des Objekts nicht. Darüber hinaus umfassen die Websites, wie OP sagt, Facebook; Die Windows-Authentifizierung funktioniert hier nicht.Eine einfache Lösung, bei der mehrere WebBrowser gleichzeitig betrieben werden
Schreiben Sie den folgenden button1 click handler:
quelle