winform,作一个网页自动提交的程序,用的webbrowser模拟写入模拟点击按钮,但是有个问题,就是不能提交太快,我设为提交一次停5秒,用的 Thread.sleep(5000),到时实现了,但是这停的5秒钟,整个机器就像死机了一样,鼠标都不能动了,过了sleep后一切又正常了,然后又到sleep,又死了,于是想用一个后台线程执行提交部分。但是执行的部分我是放在了 webbrowser的documentcompleted事件里的,就是说当整个网页全都下载完执行,这样怎么把这个事件里的执行过程放到一个线程里呢。
        private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
        {            Thread t=new Thread(new ThreadStart(zhixing));
            t.Start();
        }
如果这样,提示不行。

解决方案 »

  1.   

    提示 未处理的“System.InvalidCastException”类型的异常出现在 System.Windows.Forms.dll 中。其他信息: 指定的转换无效。
      

  2.   

    回楼上,原来是这样的     private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
            {
                HtmlDocument  hd = webBrowser1.Document;
                HtmlElement  he = null;
                HtmlElementCollection  hec = null;
                 hec = hd.All.GetElementsByName("username");
                    he = hec[0];
                    he.SetAttribute("value", "aa");
                    hec = hd.All.GetElementsByName("password");
                    he = hec[0];
                    he.SetAttribute("value", "bb");
                    hec = hd.All.GetElementsByName("Submit");
                    he = hec[0];
                    he.Focus();
                    SendKeys.Send("~");
                    Thread.Sleep(5000);
    }这样完全正常,但是当运行到sleep的时候,就和死机一样,过了5秒后回复正常。我想这里只有一个线程,sleep相当于阻塞了主线程,所以就想放到一个后台线程里。改成了这样。
            private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
            {
                if (c == false)
                {
                    Thread t = new Thread(new ThreadStart(kaishi));
                    t.Start();
                }
            }public void kaishi()
    {
                   HtmlDocument  hd = webBrowser1.Document;
                HtmlElement  he = null;
                HtmlElementCollection  hec = null;
                 hec = hd.All.GetElementsByName("username");
                    he = hec[0];
                    he.SetAttribute("value", "aa");
                    hec = hd.All.GetElementsByName("password");
                    he = hec[0];
                    he.SetAttribute("value", "bb");
                    hec = hd.All.GetElementsByName("Submit");
                    he = hec[0];
                    he.Focus();
                    SendKeys.Send("~");
                    Thread.Sleep(5000);}
    就是这样改成了一个普通的多线程,把过程放一个函数里,编译可以通过但是运行时就出错了,告诉我HtmlDocument  hd = webBrowser1.Document;这一句的时候"未处理的“System.InvalidCastException”类型的异常出现在 System.Windows.Forms.dll 中。其他信息: 指定的转换无效。"
      

  3.   

    可能你在线程中操纵不是线程创建对象所造成的错误,
    参看我blog中的方法。
      

  4.   

    Sample code as follows:
    private void InvokeFun()
    {
    HtmlDocument hd = webBrowser1.Document;
    HtmlElement he = null;
    HtmlElementCollection hec = null;
    hec = hd.All.GetElementsByName("username");
    he = hec[0];
    he.SetAttribute("value", "aa");
    hec = hd.All.GetElementsByName("password");
    he = hec[0];
    he.SetAttribute("value", "bb");
    hec = hd.All.GetElementsByName("Submit");
    he = hec[0];
    he.Focus();
    SendKeys.Send("~");
    }public void kaishi()
    {
    MethodInvoker mi = new MethodInvoker( InvokeFun );
    this.BeginInvoke( mi ); 
    Thread.Sleep(5000);}
      

  5.   

    用我上面的方法,替换原先的“kaishi”