问题描述
我有一个列表的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控件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!