winform操作webbrowser控件,全自动执行过程的精准控制!

RockHero 2015-09-02 05:45:35
如题,我有20个方法(都是操作webbrowser控件的)需要依次执行,执行第一个方法之后会返回一个结果,根据这个结果判断第一个方法是否执行成功,但是第一个方法执行完毕的时间是未知的,但我又必要等待这个返回结果判断是否成功,才能决定多久调用下一个方法执行,怎样去等待第一个方法执行完毕?用Thread.Sleep();阻塞线程肯定是不行,每个方法执行都需要等待上一个方法执行完毕,因为都是操作webbrowser控件的,等待过程都是未知的延迟时间。

核心问题就是:怎么样去等待上一方法个执行完毕返回结果,而又不中断线程,然后执行下一个方法,请有类似项目经验的大神赐教,小弟不胜感激!
...全文
242 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
RockHero 2015-09-05
  • 打赏
  • 举报
回复
问题解决了,用线程+委托 达到了我最终要的效果,后续任务会用到 线程+异步+委托,不过思路已经有了,谢谢大家!

        private void button_reg_Click(object sender, EventArgs e)
        {
            System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false;
            Thread t1 = new Thread(new ThreadStart(daohang));
            t1.Start();
        }

        public void daohang()
        {

            webBrowser1.Navigate("https://www.xxxx.com");
            Thread.Sleep(2500);
            this.webBrowser1.Invoke((MethodInvoker)  //核心问题解决的关键代码,在新线程里面委托操控UI线程
                        (() =>
                        {
                            webBrowser1.Document.GetElementById("xxxx").InvokeMember("click");
                        })
                        );
         }
  • 打赏
  • 举报
回复
依我看,你这个逻辑是这样说的: 我听说并行程序就可以不用等待啊,快啊,所以我要并行执行我的20个过程。但是我的20个过程需要依次执行,等待第一个执行完之后根据结果才能执行第二个.....以此类推“。那么我怎样又能并行执行,又能顺序执行呢? 我只能说,你琢磨的这个怪想法,根本不合逻辑啊。你根本就是个顺序执行的思路,硬往时髦的线程概念上去靠,无法实现。
  • 打赏
  • 举报
回复
你这个问题匪夷所思。明明是
void all()
{    var a = fun1();
    if(a)
    {
        fun2();
    }
    else
    {
     ......
    }
}
这种程序不会写,怎么扯上高大上的 Sleep 去了呢?
ajianchina 2015-09-03
  • 打赏
  • 举报
回复

class MyClass
{
	private WebBrowser _wb;
	
	//构造函数,实例化时传入WebBrowser实例
	public MyClass(WebBrowser wb)
	{
		_wb = wb;
	}
	
	//接下来可以对_wb进行操作
}
RockHero 2015-09-03
  • 打赏
  • 举报
回复
引用 1 楼 ajianchina 的回复:
不用Sleep是不想UI被卡死是吗?那你可以单独另开一个线程,在里头按序执行你的20个方法,也不会导致界面卡死。 差不多方法是这样的:

//设置控件的CheckForIllegalCrossThreadCalls属性,使之可跨线程操作webbrowser控件
//当然,你还可以通过使用Invoke调用委托
System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false;

Thread 任务线程 = new Thread(new ThreadStart(任务方法));
任务线程.Start();

void 任务方法()
{
	while(true)
	{
		//以方法返回的bool判断是否重新执行该方法,下面类似
		if (方法1()) break;
	}
	while(true)
	{
		if (方法2()) break;
	}
	
	.....
	
	while(true)
	{
		if (方法20()) break;
	}
	
	//如果你还要从头再来,这里加个goto跳前面再从方法1开始
}
那怎样在自定义的类中,访问到 winform 中的控件?
devmiao 2015-09-02
  • 打赏
  • 举报
回复
用委托,把后续步骤放在委托中
ajianchina 2015-09-02
  • 打赏
  • 举报
回复
不用Sleep是不想UI被卡死是吗?那你可以单独另开一个线程,在里头按序执行你的20个方法,也不会导致界面卡死。 差不多方法是这样的:

//设置控件的CheckForIllegalCrossThreadCalls属性,使之可跨线程操作webbrowser控件
//当然,你还可以通过使用Invoke调用委托
System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false;

Thread 任务线程 = new Thread(new ThreadStart(任务方法));
任务线程.Start();

void 任务方法()
{
	while(true)
	{
		//以方法返回的bool判断是否重新执行该方法,下面类似
		if (方法1()) break;
	}
	while(true)
	{
		if (方法2()) break;
	}
	
	.....
	
	while(true)
	{
		if (方法20()) break;
	}
	
	//如果你还要从头再来,这里加个goto跳前面再从方法1开始
}

110,561

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧