gpt4 book ai didi

c# - 新线程中的 WebBrowser 控件

转载 作者:太空宇宙 更新时间:2023-11-03 16:24:59 24 4
gpt4 key购买 nike

我有一个要“单击”的 Uri 列表为了实现这一点,我正在尝试为每个 Uri 创建一个新的 Web 浏览器控件。我为每个 Uri 创建一个新线程。我遇到的问题是线程结束在文档完全加载之前,所以我永远无法使用 DocumentComplete 事件。我该如何克服这个问题?

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

最佳答案

您必须创建一个泵送消息循环的 STA 线程。对于像 WebBrowser 这样的 ActiveX 组件,这是唯一适合的环境。否则您不会获得 DocumentCompleted 事件。一些示例代码:

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
}
}

关于c# - 新线程中的 WebBrowser 控件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12883123/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com