web浏览器控件不等待事件执行的问题
本文关键字:执行 问题 事件 等待 浏览器 控件 web | 更新日期: 2023-09-27 17:57:49
我试图进入一些网页并获取一些信息,使用web浏览器,以便它记住我的登录详细信息。到目前为止一切正常,但对于多个url,web浏览器文档加载并没有像我希望的那样正常工作。
我的意图是转到url->等待它加载-->将所需的数据加载到文本-->新的url和相同的过程中。
我使用for循环来更改url,但当我运行时,所有的url都会一个接一个地传递,而不是等到文档加载并写入文本。请帮帮我。
private void button1_Click_1(object sender, EventArgs e)
{
String text = File.ReadAllText("links.txt");
var result = Regex.Split(text, "'r'n|'r|'n");
foreach (string s in result)
{
listBox1.Items.Add(s);
}
for (int i = 0; i < listBox1.Items.Count; i++)
{
this.Text = Convert.ToString(i + 1) + "/" + Convert.ToString(listBox1.Items.Count);
textBox1.Text += listBox1.Items[i];
String url = textBox1.Text;
webBrowser2.ScriptErrorsSuppressed = true;
webBrowser2.DocumentCompleted += webBrowser2_DocumentCompleted;
webBrowser2.Navigate(url);
}
}
void webBrowser2_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
string sourceCode = webBrowser2.DocumentText;
try
{
/*someregax expressions to filter text */
StreamWriter sw = new StreamWriter("inks_info.txt", true);
sw.Write("url" + "~" + sourceCode + "'n");
sw.Close();
textBox1.Text = "";
}
catch
{
StreamWriter sw = new StreamWriter("inks_fail.txt", true);
sw.Write(textBox1.Text + "'n");
sw.Close();
textBox1.Text = "";
}
}
每个项目的文档加载上都有一个事件处理程序,但在启动第二次导航之前,您不需要等待它在第一次导航后启动。您的for循环需要"更加异步"。例如,将项目放入队列并一次请求一个:
Queue<string> _items;
private void button1_Click_1(object sender, EventArgs e)
{
String text = File.ReadAllText("links.txt");
_items = new Queue<string>(Regex.Split(text, "'r'n|'r|'n"));
webBrowser2.ScriptErrorsSuppressed = true;
webBrowser2.DocumentCompleted += webBrowser2_DocumentCompleted;
RequestItem();
}
private void RequestItem()
{
if (_items.Any())
{
var url = _items.Dequeue(); // preprocess as required
webBrowser2.Navigate(url);
}
}
void webBrowser2_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
// Handle result
RequestItem(); // Then request next item
}
您的代码看起来也使用UI元素(如列表框)作为中间变量,只是为了逻辑目的,而不是显示。您应该将逻辑(使用常规变量、数据结构(如列表和请求数据)与显示(在列表框中显示结果、更新文本框等)分开。甚至还不清楚你是否想使用WebBrowser
——看起来你只是在下载文本,应该使用WebClient
或HttpClient
。然后,使用async/await:,代码也可以更干净
foreach (var url in urls)
{
string text = await new WebClient().DownloadStringAsync(url);
// Handle text
}
非常简单的答案。WebBorwser控件对这些东西很糟糕,但这里是你要找的:
WHILE(webBrowser.ReadyState != WebBrowserReadyState.Ready)
{
Application.DoEvents()
}
就是这样。它不会冻结你的应用程序或让你迷失在代码中,它只是等到它不导航。非常欢迎您。