张贴webBrowser1_DocumentCompleted保持循环

本文关键字:循环 DocumentCompleted webBrowser1 张贴 | 更新日期: 2023-09-27 18:17:01

我写了一些代码来发布消息到一个网站。它工作得很好(对于第一个实例),问题是,一旦它在webBrowser1_DocumentCompleted方法中,它就会不断循环(一遍又一遍地运行SendData方法)。所以我肯定没有处理好这件事。在它运行一次SendData调用之后,我希望它返回到它最初开始的button1_Start_Click事件。

private void button1_Start_Click(object sender, EventArgs e)
    {

        GetData();

    }

    private void GetData()
    {
        webBrowser1.Navigate(inputURLID);
    }

    private void SendData()
    {
        webBrowser1.Document.GetElementById("subject").SetAttribute("value", textBox2_Subject.Text);//To (username)
        webBrowser1.Document.GetElementById("message").SetAttribute("value", richTextBox1.Text);//Subject
        webBrowser1.Document.GetElementById("Submit").InvokeMember("click");//Message
    }

    private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
    {
        SendData();
    }

张贴webBrowser1_DocumentCompleted保持循环

我必须张贴,你选择的答案会让你陷入大麻烦。解决方法很简单,您只需要一个变量来告诉您下一个DocumentCompleted事件是您感兴趣的事件。这样的:

private bool WaitingForData;
private void GetData()
{
    webBrowser1.Navigate(inputURLID);
    WaitingForData = true;
}
private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
    if (WaitingForData) SendData();
    WaitingForData = false;
}

问题是,当你点击Submit时,会加载一个新页面,并为这个新页面再次调用DocumentCompleted。

你可以尝试这样做:

bool documentCompleted = false;
private void button1_Start_Click(object sender, EventArgs e)
{
    webBrowser1.Navigate(inputURLID);
    WaitForDocumentCompleted();
    SendData();
    WaitForDocumentCompleted();
}
private void WaitForDocumentCompleted()
{
    while (!documentCompleted)
    {
        Thread.Sleep(100);
        Application.DoEvents(); 
    }
    documentCompleted = false;
}
private void SendData()
{
    webBrowser1.Document.GetElementById("subject").SetAttribute("value", textBox2_Subject.Text);//To (username)
    webBrowser1.Document.GetElementById("message").SetAttribute("value", richTextBox1.Text);//Subject
    webBrowser1.Document.GetElementById("Submit").InvokeMember("click");//Message
}
private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
    documentCompleted = true;
}