在一个新的线程WebBrowser

在一个新的线程WebBrowser

本文介绍了在一个新的线程WebBrowser控件的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个列表的URI,我想点击要做到这一点,我米试图建立每乌里一个新的Web浏览器的控制。我创建每个开放的一个新的线程。我遇到的问题是线头满载文档之前,所以我从来没有使用DocumentComplete事件的。我该如何克服这个问题?

  VAR项目=新ParameterizedThreadStart(ClicIt.Click);
VAR线程=新主题(项目){名称=ClickThread};
thread.Start(uriItem);公共静态无效点击(对象o)
{
    VAR URL =((UriItem)O);
    Console.WriteLine(@点击+ url.Link);
    VAR唱首歌=新增了WebBrowser {ScriptErrorsSup pressed = TRUE};
    clicker.DocumentCompleted + = BrowseComplete;
    如果(String.IsNullOrEmpty(url.Link))回报;
    如果(url.Link.Equals(关于:空白))回报;
    如果(url.Link.StartsWith(HTTP://)及和放大器; url.Link.StartsWith(https://开头!))
        url.Link =HTTP://+ url.Link;
    clicker.Navigate(url.Link);
}


解决方案

您必须创建一个STA线程泵消息循环。这对于像web浏览器ActiveX组件的唯一好客的环境。你不会得到DocumentCompleted事件,否则。一些示例code:

 私人无效runBrowserThread(URI URL){
    VAR日=新主题(()=> {
        VAR BR =新的WebBrowser();
        br.DocumentCompleted + = browser_DocumentCompleted;
        br.Navigate(URL);
        Application.Run();
    });
    th.SetApartmentState(ApartmentState.STA);
    th.Start();
}无效browser_DocumentCompleted(对象发件人,WebBrowserDocumentCompletedEventArgs E){
    VAR BR =发件人作为web浏览器;
    如果(br.Url == e.Url){
        Console.WriteLine(Natigated {0},e.Url);
        Application.ExitThread(); //停止线程
    }
}

I have a list Uri's that I want "clicked" To achieve this I"m trying to create a new web-browser control per Uri. I create a new thread per Uri. The problem I'm having is the thread end before the document is fully loaded, so I never get to make use of the DocumentComplete event. How can I overcome this?

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);
}
解决方案

You have to create an STA thread that pumps a message loop. That's the only hospitable environment for an ActiveX component like WebBrowser. You won't get the DocumentCompleted event otherwise. Some sample code:

private void runBrowserThread(Uri url) {
    var th = new Thread(() => {
        var br = new WebBrowser();
        br.DocumentCompleted += browser_DocumentCompleted;
        br.Navigate(url);
        Application.Run();
    });
    th.SetApartmentState(ApartmentState.STA);
    th.Start();
}

void browser_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) {
    var br = sender as WebBrowser;
    if (br.Url == e.Url) {
        Console.WriteLine("Natigated to {0}", e.Url);
        Application.ExitThread();   // Stops the thread
    }
}

这篇关于在一个新的线程WebBrowser控件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

08-20 06:27
查看更多