c# foreach循环,循环第一次后 等待一个事件执行完毕 再循环第二次,详细说明:事件是一个加载事件,就是一个控件加载完毕后自动执行的。
循环中会打开那个控件。

解决方案 »

  1.   

    外面加一个i=0;
    each {
    ++i;
     if(i==1){
       加载你的那个事件
     }
      

  2.   

    循环体中增加一个变量。
    打开控件时,将这个变量传过去,控件加载完毕后,将这个值修改掉,传值时使用ref关键字。
    在循环体中,判断这个值是否变化了,如果没有变化就等待sleep。
      

  3.   

    一定得用forach么
    可以用别的方式实现吗
      

  4.   

     #region webBrowser事件
            private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)这个是我的事件,我的循环中会个webbrowser加载网页,加载完毕了这个事件应该执行的,可是我的循环好像 没有等待事件执行完了在继续循环
      

  5.   

    把foreach里的事件弄个锁给锁起来
    不释放锁其他事件就等它
      

  6.   

    都已经说了啊 bool lock=false;  foreach 里用while(lock){等待啊}  
    事件{lock=true  ...执行完....lock=false}
      

  7.   

    可以使用可以使用事件的同步方法,每次foreach进来后,AutoResetEvent.WaitOne一下,此时该线程挂起,  等控件Onload之后,发送信息过来,AutoResetEvent.Reset, 或者使用ManualResetEvent,两个不同是Reset的时候,通知一个挂起线程还是多个,具体可参考MSDN,http://msdn.microsoft.com/zh-cn/library/zd6a283y.aspx
      

  8.   

    楼主可能不清楚http协议,浏览器在请求一个页面时页面时向服务器建立一个连接,服务器收到请求后利用这个连接将页面html内容发给浏览器,浏览器就完成了一次页面加载,但页面中的图片,flash,视频音频等多媒体元素并不会再这次连接中完成传送,浏览器接收完页面文件后会解析这些多媒体元素的链接地址,并按地址逐个下载到本地,不同内核的浏览器显示这些元素的方式有所曲别,有的是下载一个显示一个,有的是等全部下载完后一次性显示。完成了所有工作,展现在用户面前的才是一个完整的页面。 webBrowser可以看做一个浏览器,加载页面的原理也基本上和上述差不多。楼主的感觉页面还没加载完循环就开始了,那是因为webBrowser在下载页面媒体元素,其实页面的html部分于下载这些个元素之前就完成加载了。
      

  9.   

    你的程序 是异步执行的,建议不要写这样的 ForEach 语句;用另外的方式 实现你需要的功能。
      

  10.   

    int i=0;
    foreach(.....)
    {
        if(i==0)
        while (WebBrowser1.ReadyState != WebBrowserReadyState.Complete)
        { 
            Application.DoEvents(); 
        }
        i++;
       //你的其他处理过程
    }
      

  11.   

    是啊,得建立个lock锁一小下呵呵
      

  12.   

    object padlock = new object();lock(padlock)
    {
       //..}锁是这样锁的`
      

  13.   

    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
                //避免还没执行完,用户退出软件时候的异常
            }
        }
    }
      

  14.   

    可以使用可以使用事件的同步方法,每次foreach进来后,AutoResetEvent.WaitOne一下,此时该线程挂起, 等控件Onload之后,发送信息过来,AutoResetEvent.Reset, 或者使用ManualResetEvent,两个不同是Reset的时候,通知一个挂起线程还是多个,具体可参考MSDN,http://msdn.microsoft.com/zh-cn/library/zd6a283y.aspx
    就是这样了