c# foreach循环 c# foreach循环,循环第一次后 等待一个事件执行完毕 再循环第二次,详细说明:事件是一个加载事件,就是一个控件加载完毕后自动执行的。循环中会打开那个控件。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 外面加一个i=0;each {++i; if(i==1){ 加载你的那个事件 }} 循环体中增加一个变量。打开控件时,将这个变量传过去,控件加载完毕后,将这个值修改掉,传值时使用ref关键字。在循环体中,判断这个值是否变化了,如果没有变化就等待sleep。 一定得用forach么可以用别的方式实现吗 #region webBrowser事件 private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)这个是我的事件,我的循环中会个webbrowser加载网页,加载完毕了这个事件应该执行的,可是我的循环好像 没有等待事件执行完了在继续循环 把foreach里的事件弄个锁给锁起来不释放锁其他事件就等它 都已经说了啊 bool lock=false; foreach 里用while(lock){等待啊} 事件{lock=true ...执行完....lock=false} 可以使用可以使用事件的同步方法,每次foreach进来后,AutoResetEvent.WaitOne一下,此时该线程挂起, 等控件Onload之后,发送信息过来,AutoResetEvent.Reset, 或者使用ManualResetEvent,两个不同是Reset的时候,通知一个挂起线程还是多个,具体可参考MSDN,http://msdn.microsoft.com/zh-cn/library/zd6a283y.aspx 楼主可能不清楚http协议,浏览器在请求一个页面时页面时向服务器建立一个连接,服务器收到请求后利用这个连接将页面html内容发给浏览器,浏览器就完成了一次页面加载,但页面中的图片,flash,视频音频等多媒体元素并不会再这次连接中完成传送,浏览器接收完页面文件后会解析这些多媒体元素的链接地址,并按地址逐个下载到本地,不同内核的浏览器显示这些元素的方式有所曲别,有的是下载一个显示一个,有的是等全部下载完后一次性显示。完成了所有工作,展现在用户面前的才是一个完整的页面。 webBrowser可以看做一个浏览器,加载页面的原理也基本上和上述差不多。楼主的感觉页面还没加载完循环就开始了,那是因为webBrowser在下载页面媒体元素,其实页面的html部分于下载这些个元素之前就完成加载了。 你的程序 是异步执行的,建议不要写这样的 ForEach 语句;用另外的方式 实现你需要的功能。 int i=0;foreach(.....){ if(i==0) while (WebBrowser1.ReadyState != WebBrowserReadyState.Complete) { Application.DoEvents(); } i++; //你的其他处理过程} 是啊,得建立个lock锁一小下呵呵 object padlock = new object();lock(padlock){ //..}锁是这样锁的` WebBrowser[] wbs = new WebBrowser[2];string[] urls = { "http://www.qq.com", "http://www.csdn.net" };private void button1_Click(object sender, EventArgs e){ wbs[0] = new WebBrowser(); wbs[0].Dock = DockStyle.Top; this.Controls.Add(wbs[0]); wbs[1] = new WebBrowser(); wbs[1].Dock = DockStyle.Fill; this.Controls.Add(wbs[1]); for (int i = 0; i < urls.Length; i++) { try { wbs[i].Navigate(urls[i]); while (wbs[i].ReadyState != WebBrowserReadyState.Complete) Application.DoEvents(); } catch (InvalidOperationException) { //skip InvalidOperationException //避免还没执行完,用户退出软件时候的异常 } }} 可以使用可以使用事件的同步方法,每次foreach进来后,AutoResetEvent.WaitOne一下,此时该线程挂起, 等控件Onload之后,发送信息过来,AutoResetEvent.Reset, 或者使用ManualResetEvent,两个不同是Reset的时候,通知一个挂起线程还是多个,具体可参考MSDN,http://msdn.microsoft.com/zh-cn/library/zd6a283y.aspx就是这样了 C# 在Form1中改变Form2窗口的TextBox winfrom datagridview如何实现标题栏随着滚动条滚动 一直在最上 有图 谁有ajax做的web聊天室的源码啊? 急需C#工具箱完全版 关于C#打包的问题 C++结构体转义到C#中,在线等 C# Form窗体中的Button按钮问题!!高分求救!!谢谢!! 请问如何使用.NET下的DotNetBar控件 我用c#打开excel以后,要写入大量数据,但是在这过程中打开excel会打开正在写的excel. 很急,朋友帮忙了 一个文本框获取焦点时,激发什么事件呀? udp传输问题
each {
++i;
if(i==1){
加载你的那个事件
}
}
打开控件时,将这个变量传过去,控件加载完毕后,将这个值修改掉,传值时使用ref关键字。
在循环体中,判断这个值是否变化了,如果没有变化就等待sleep。
可以用别的方式实现吗
private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)这个是我的事件,我的循环中会个webbrowser加载网页,加载完毕了这个事件应该执行的,可是我的循环好像 没有等待事件执行完了在继续循环
不释放锁其他事件就等它
事件{lock=true ...执行完....lock=false}
foreach(.....)
{
if(i==0)
while (WebBrowser1.ReadyState != WebBrowserReadyState.Complete)
{
Application.DoEvents();
}
i++;
//你的其他处理过程
}
{
//..}锁是这样锁的`
string[] urls = { "http://www.qq.com", "http://www.csdn.net" };
private void button1_Click(object sender, EventArgs e)
{
wbs[0] = new WebBrowser();
wbs[0].Dock = DockStyle.Top;
this.Controls.Add(wbs[0]);
wbs[1] = new WebBrowser();
wbs[1].Dock = DockStyle.Fill;
this.Controls.Add(wbs[1]);
for (int i = 0; i < urls.Length; i++)
{
try
{
wbs[i].Navigate(urls[i]);
while (wbs[i].ReadyState != WebBrowserReadyState.Complete) Application.DoEvents();
}
catch (InvalidOperationException)
{
//skip InvalidOperationException
//避免还没执行完,用户退出软件时候的异常
}
}
}
就是这样了