c#中,怎么实现for循环根据条件暂停执行:即在每一次循环的过程中都要去处理另一个需要几十秒时间的程序,在这个程序完成后返回并再继续f

globalmtrl 2007-05-30 11:40:20

程序的情况:
在winform程序中有一个窗口,在这个窗口中放置了两个webbrowser控件(wbList,wbDetail),左边的用来显示一个web的List列表页面,而在右边显示在List页面加载成功后再分别自动显示列表中每一条记录的Detail详细页面(需要的数据在这里处理).
遇到的问题:
现在遇到的问题是,在左边的List页面加载完成后,我在它的DocumentCompleted事件时来循环显示Detail页面,调用的代码是wbDetail.Navigate(strURI);(这个操作比较耗时,估计得有十秒钟左右的),然而在用for循环时分别显示Detail的页面时,由于for循环它就不能停下来,一下子就把循环执行完了,而在每次循环过程中显示需要耗时Detail页面,除了最后一个能正常显示外其它的都不能正常显示!
需要的处理办法:
我想到过控制线程,尽可能使这在每一次循环过程中执行wbDetail.Navigate(strURI);时让for循环暂停执行,待wbDetail.Navigate(strURI);执行完成后再继续for循环!但是这个怎么来实现呢?怎么来控件这两个webbrowser控件按照我所设想的顺序来执行的呢?
除了线程,还有锁等控件代码块操作的方法都可以的,thank:)

...全文
3373 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
Dawnice Tam 2012-07-09
  • 打赏
  • 举报
回复
很想知道怎么实现的....
globalmtrl 2007-05-31
  • 打赏
  • 举报
回复
ok
globalmtrl 2007-05-31
  • 打赏
  • 举报
回复
To:Qim(莫名-从星做起......) 、hertcloud(·£孙子兵法£·)
不知道你们说的多线程是否能解决我提出的这个问题,因为我需要它按照设定“顺序”执行,List页面和Detail页面不能“并行”执行的哈:)
globalmtrl 2007-05-31
  • 打赏
  • 举报
回复
谢谢各位热心回复,我的问题就用一个bool变量和Application.DoEvents();就OK了:)
回个电话,完了来结贴哈,再次thanks:)
北极猩猩 2007-05-30
  • 打赏
  • 举报
回复
每次启动一个Thread来执行任务,然后通过Thread.Join等待任务执行完毕。
wzd24 2007-05-30
  • 打赏
  • 举报
回复
不要用For循环,用Timer定时器试试。
古都老码农 2007-05-30
  • 打赏
  • 举报
回复
用datetimer()控件试试
hertcloud 2007-05-30
  • 打赏
  • 举报
回复
参考这里
http://blog.csdn.net/hertcloud/archive/2007/04/07/1556112.aspx

使用多线程 用
将你要执行的部分 写成函数 然后使用 事件委托的模式

while(true){//事件调用.... //Thread.Sleep(10000) 每10秒执行一次}

参考上面地址.
hazrael 2007-05-30
  • 打赏
  • 举报
回复
To globalmtrl(环球):

你没用过事件(Event)么?定义成类的成员变量就可以了。像你这个简单的要求,定义成AutoResetEvent就可以了(C#)。
private AutoResetEvent _CompletedEvent = new AutoResetEvent(true);
好像是true吧,表示终止状态,记不清了,可以试试。很简单的,在多线程中应用很多。
Qim 2007-05-30
  • 打赏
  • 举报
回复
搞定了没?

实在不行就用多线程试试看。
单独开一个线程。
private Thread poThread;

private void button1_Click(object sender, EventArgs e)
{
poThread = new Thread(new ThreadStart(myThread));
poThread.IsBackground = true;
poThread.Start();

}

private void myThread()
{
for (int i = 0; i < 10; i++)
{
webBrowser1.Navigate("http://www.csdn.net");
Thread.Sleep();
}
}

//在
private void wbDetail_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
poThread.Resume();
}

globalmtrl 2007-05-30
  • 打赏
  • 举报
回复

其实,加Application.DoEvents();也就可以的哈:)


-----------------------
To:hazrael(没事儿偷着乐)
你在两个方法里用到的completedEvent.WaitOne();和completedEvent.Set();中的“completedEvent”是在哪个定义的?想试一下你这个方法,但又不知道咋用的了:)

hazrael 2007-05-30
  • 打赏
  • 举报
回复
To globalmtrl(环球):
WebBrowser控件的加载完成事件是哪个,我没有具体去查。反正就是在加载完成事件里,设置Event就可以了。
不清楚你说的针对两个不同方法是什么意思,不过如果WebBrowser控件加载信息是异步的话(同步也不需要提问了,对不?(*^__^*) 嘻嘻……),Event应该就是你想要的功能。
例如(C#代码,C++代码同理):
private void func1()
{
for (int i = 0; i < 10; i++)
{
webBrowser1.Navigate("http://www.csdn.net");
completedEvent.WaitOne();
}
}

// 以下这个函数是当WebBrowser的DocumentCompleted事件发生时调用
private void wbDetail_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
completedEvent.Set();
}
北极猩猩 2007-05-30
  • 打赏
  • 举报
回复
thread1.Join
的作用是要求当前线程等待thread1运行结束在继续运行。

至于每次产生一个线程,如果你考虑效率问题,可以使用ThreadPool
globalmtrl 2007-05-30
  • 打赏
  • 举报
回复
To:hazrael
1.在List循环中执行wbDetail.Navigate(strURI);是在方法private string SpecifyElementToWB(int index1)中实现的,代码如下:
for (int i = 0; i < htmlEC[index1].GetElementsByTagName("a").Count - 3; i+=2)
{
string strURI = ((mshtml.HTMLAnchorElementClass)(htmlEC[index1].GetElementsByTagName("a")[i].DomElement)).href;

//在Navigate赋值后暂停for循环的执行,让wbDetail加载完成后再继续for循环执行?
wbDetail.Navigate(strURI);

}

2.wbDetail控件的加载完成事件是方法是 private void wbDetail_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
现在在处理的就是在循环中执行了wbDetail.Navigate(strURI);后,wbDetail控件的加载操作也就开始,并且要使它的wbDetail_DocumentCompleted完成后,才能继续SpecifyElementToWB(int index1)中的for的下一次循环。
就你说的使用Event的使用?这个Event是加到类里的,而我这里是针对两个不同方法,这又应该怎么操作呢?
globalmtrl 2007-05-30
  • 打赏
  • 举报
回复
To:liubin911
你用Thread.Sleep(3000),它会将主程序的线程也全部停了的,这样一来它也不会执行wbDetail.Navigate(strURI);这个操作的,对解决问题没有效果的哟:)
globalmtrl 2007-05-30
  • 打赏
  • 举报
回复
To:Polarislee
老兄,你说的办法还没试过,但这样一来每次启动一个线程,那么在循环几千次的情况下,会不会有什么问题的呢?你说的Thread.Join,是将新启动的线程加到主程序的么?这样一来,它会自动让新启动的线程执行,而在主程序中执行的for循环能暂停下来的吗?
hazrael 2007-05-30
  • 打赏
  • 举报
回复
可以使用Event。在WebBrowser.Navigate函数调用后,等待事件消息。在WebBrowser.Navigated事件接收函数中,设置Event。这样的话,for循环就被阻止了。
globalmtrl 2007-05-30
  • 打赏
  • 举报
回复
To:ChinaArmy()、wzd24
用datetimer()好象行不通的,因为Detail的执行时间不确定的,最好是在显示Detail这一过程的时候,其它的操作都暂停,它加载完成再继续的:)
liubin911 2007-05-30
  • 打赏
  • 举报
回复
先引用
using System.Threading;

在代码中需要暂停语句前写
Thread.Sleep(3000);//3000毫秒,多少自己设

17,748

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 .NET Framework
社区管理员
  • .NET Framework社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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