为webBrowser_.DocumentCompleted创建多个处理程序

问题描述

这是我的课程:

 λ> 
 λ> import Control.Arrow
 λ> 
 λ> maximumBy  (comparing (second id))  (zip xs [0..])
 (7,3)
 λ> 
 λ> maximumBy  (comparing (second negate))  (zip xs [0..])
 (7,1)
 λ> 
 λ> maximumBy  (comparing (id *** negate))  (zip xs [0..])
 (7,1)
 λ> 

在主代码中:

class WebRequestWaiter
{
    private WebBrowser webBrowser_;
    private bool completed_ = false;
    private Guid uuid_ = Guid.NewGuid();

    public WebRequestWaiter(WebBrowser webBrowser)
    {
        webBrowser_ = webBrowser;
        webBrowser_.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler((sender,e) => _webBrowserDocumentCompleted(sender,e,uuid_));
    }

    private void _webBrowserDocumentCompleted(object sender,WebBrowserDocumentCompletedEventArgs e,Guid uuid)
    {
        if (uuid == uuid_)
        {
            completed_ = true;
            webBrowser_.DocumentCompleted -= (sender2,e2) => _webBrowserDocumentCompleted(sender,uuid);
        }
    }

    public void WaitForComplete()
    {
        while (!completed_)
            Application.DoEvents();
    }
}

我想让代码在1个函数中运行,而不是这样:

private void button_Search_Click(object sender,EventArgs e)
{
    WebRequestWaiter WRW = new WebRequestWaiter(webBrowser1);
    HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create("https://example.com/search.php");
    HttpWebResponse response = (HttpWebResponse)webRequest.GetResponse();
    Stream receiveStream = response.GetResponseStream();
    webBrowser1.DocumentStream = receiveStream;
    WRW.WaitForComplete();
    //Code only continue when webBrowser1 Completed

    webBrowser1.Document.GetElementById("keyword").SetAttribute("value",textBox_Search.Text);
    foreach (HtmlElement item in webBrowser1.Document.GetElementsByTagName("input"))
    {
        if (item.GetAttribute("value") == "Search Now")
        {
            WRW = new WebRequestWaiter(webBrowser1);
            item.InvokeMember("Click");
            break;
        }
    }
    
    WRW.WaitForComplete();
    //Code only continue when webBrowser1 Completed !BUT IT WON'T WAIT!
    //webBrowser1 contains the previous response

    foreach (HtmlElement item in webBrowser1.Document.GetElementsByTagName("p")) 
    {
        if (item.GetAttribute("className") == "description")
        {
            foreach (HtmlElement item2 in item.GetElementsByTagName("u"))
            {
                MessageBox.Show(item2.InnerText); //this is debug
            }
            break;
        }

    }
}

我可以这样做,但是当有10个以上时,我会迷失其中,而且我也无法对此进行适当的循环

(我在第一次尝试中也使用了它,但是它做了同样的事情(当webBrowser1.Document仍然包含旧的(先前的)信息时才通过了它): private void button_Search_Click(object sender,EventArgs e) { webBrowser1.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(webBrowser1_DocumentCompleted1); DoSomethingThatChangeThePage(); } void webBrowser1_DocumentCompleted1(object sender,WebBrowserDocumentCompletedEventArgs e) { webBrowser1.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(webBrowser1_DocumentCompleted2); DoSomethingThatChangeThePage(); } void webBrowser1_DocumentCompleted2(object sender,WebBrowserDocumentCompletedEventArgs e) { webBrowser1.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(webBrowser1_DocumentCompleted3); DoSomethingThatChangeThePage(); } void webBrowser1_DocumentCompleted3(object sender,WebBrowserDocumentCompletedEventArgs e) { webBrowser1.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(webBrowser1_DocumentCompleted4); DoSomethingThatChangeThePage(); } //etc

有什么办法可以使我的课堂上班吗?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)