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();
}
如果这样,提示不行。
private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{ Thread t=new Thread(new ThreadStart(zhixing));
t.Start();
}
如果这样,提示不行。
{
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 中。其他信息: 指定的转换无效。"
参看我blog中的方法。
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);}