public void DoGUIClear()
        {
            if (this.InvokeRequired)
            {
                GUIClear delegateMethod = new GUIClear(this.DoGUIClear);
                this.Invoke(delegateMethod);
            }
            else
                this.lstRegisterValues.Items.Clear();
        }
源程序如上,我不清楚该程序段的功能,特别是if那部分。感觉是一个循环调用并等待的过程,不知道是不是这样的

解决方案 »

  1.   

    http://social.msdn.microsoft.com/Forums/zh-CN/2212/thread/4d700595-bbd8-4db4-9ae6-0d1e045fe18c/
      

  2.   

    if (this.InvokeRequired)只是判断当前环境,是否需要跨线程赋值。如果需要,则必须使用 Control.Invoke(delegate, object) 
      

  3.   

    InvokeRequired属性表示对控件的操作是否需要在创建它的线程上执行,如果需要的话就让创建控件的线程去执行,否则就在调用此方法的线程上执行。一般情况下对控件的操作只能让创建它的线程执行的。不知道我说清楚没,希望对你有帮助
      

  4.   

    如果我所用控件都是在一个线程上的,那if (this.InvokeRequired)这部分只是以防万一?
      

  5.   

    只要不在 UI 主线程上,都必须用 Control.Invoke(delegate, object) 
      

  6.   


    是这么回事.. 如果不想这么调用 必须设置一个值
    // 获取或设置一个值,该值指示是否捕获对错误线程的调用,这些调用在调试应用程序时访问控件的 System.Windows.Forms.Control.Handle 属性。
    // 返回结果:
    // 如果捕获了对错误线程的调用,则为 true;否则为 false。
    Control.CheckForIllegalCrossThreadCalls = false;否则 在非创建控件的线程上调用控件的方法和属性会报异常的.
    public void DoGUIClear()
      {
      if (this.InvokeRequired)//如果在非创建控件的线程上.
      {
    //生成一个委托的方法
      GUIClear delegateMethod = new GUIClear(this.DoGUIClear);
    //调用委托的方法. 这个调用,使用了this对象(创建控件的句柄对象)
      this.Invoke(delegateMethod);//这么调用就"名正言顺"了
      }
      else//否则 是在创建控件的线程上执行此函数, 可以直接访问控件.
      this.lstRegisterValues.Items.Clear();
      }