【问题标题】:How to use different events across many web browsers如何在多个 Web 浏览器中使用不同的事件
【发布时间】:2013-02-26 12:36:24
【问题描述】:

我正在开发一个应用程序,我想创建多个线程,每个线程必须创建一个WebBrowser,其中每个WebBrowser 都使用webBrowser_DocumentCompleted 方法。

每个已创建的WebBrowser 实例如何拥有自己的DocumentCompleted 处理程序,而不是在所有实例中使用相同的webBrowser_DocumentCompleted 方法。

我解释一下:

在一种情况下,使用单个网络浏览器进行操作

int a = 0;
private void button1_Click(object sender, EventArgs e)
        {
            methode1();
        }
private void webBrowser_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
        {
            if (a == 1) methode2(wb);
            if (a == 2) methode2(wb);
        }

public void methode1()
        {
            webBrowser.Navigate("http://www.test.com");
            a = 1;
        }
public void methode2()
        {
            HtmlElement txt1 = webBrowser1.Document.GetElementById("tesxtbox1");
            txt1.SetAttribute("value", "test");
            webBrowser.Document.Forms[0].InvokeMember("submit");
            a = 2;
        }
public void methode3()
        {
            webBrowser.Navigate("http://www.test3.com");
        }

但如果我想进行多个操作,即在butoon1中我添加:

private void button1_Click(object sender, EventArgs e)
        {
            for(int i=0; i<5  ;i++)
            methode1();
        }

然后去做,我想我必须有几个webbrowser,所以解决方法是为每个操作创建一个线程

private void button1_Click(object sender, EventArgs e)
        {
            for(int i=0; i<5  ;i++)
            {
                Thread thread = new Thread(new ThreadStart(methode1));
                thread.Start();
            }   
        }

因此,线程创建的每个网络浏览器都必须有自己的方法webBrowser_DocumentCompleted,以免与其他网络浏览器的结果混淆。

或者,对所有创建的网络浏览器使用相同的方法webBrowser_DocumentCompleted,但问题是如何指定哪个网络浏览器,调用方法webBrowser_DocumentCompleted。

提前致谢

【问题讨论】:

    标签: c# .net multithreading winforms browser


    【解决方案1】:

    很容易,更改方法的名称。

    当您创建WebBrowser 时,您可以将DocumentCompleted 指定为您想要的任何方法,例如:

    firstWebBrowser.DocumentCompleted += firstDocumentCompleted;
    secondWebBrowser.DocumentCompleted += secondDocumentCompleted;
    thirdWebBrowser.DocumentCompleted += thirdDocumentCompleted;
    

    如果您使用的是设计器,也同样简单。在“事件”选项卡中,只需键入一个新的(唯一的)方法名称。

    既然您提到了线程,我确实设想了一个问题,如果您不预先占用您将拥有的 Web 浏览器(以及事件处理程序)的数量。但如果您需要帮助,我们需要更具体的用例示例。

    【讨论】:

    • 这个。当然,它假设代码已经存在,但如果不存在,则 OP 有其他问题需要先解决。 :)
    • 感谢 Rudi Visser,我更新了我的问题以获得更多解释
    • @AbdelkarimTinguer 我不确定我是否能一眼看出你在做什么,但如果代码可以以这样一种方式编写,即一个(可能是参数化的)方法可以完成这项工作,但一个单个事件处理程序不能,查看匿名函数。 webBrowser.DocumentCompleted += (obj,e) =&gt; { Console.WriteLine(obj.ToString()); };(语法可能略有偏差,但你明白了)那么这个答案仍然有效。
    猜你喜欢
    • 2019-12-14
    • 2012-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-13
    • 1970-01-01
    相关资源
    最近更新 更多