请问各位winform同行,如何很好的理解.net自带的各个控件的Invoke()方法,msdn上说:在拥有此控件的基础窗口句柄的线程上执行委托。但是如何理解这句话,我在做一项目中需要在一个线程中更新主界面的一些控件,我也使用了invoke()方法,但说实话,我还是不是很理解,是不是就是在一个线程中要更新一些控件就要在线程中使用要更新控件的Invoke方法才能更新此控件。

解决方案 »

  1.   

    这个问题很重要
    以前有个说法,是Windows程序就不要用多线程
    这是因为在非UI线程内操作窗体时可能会出现显示不正常的问题Control.Invoke提供了一个解决方案,他需要一个delegate参数,你可以理解为一个或多个方法本身;执行此方法后,窗口过程会在一个合适的时候执行传递过去的方法(delegate所纪录的方法) —— 在主UI线程内简单的讲,在非主线程内做更新窗口的操作,必须使用Control.Invoke
      

  2.   

    谢谢速马,不过有些时候在非ui在线程中设置一些界面控件的属性却是可以的,比如说设置StatusBar的Text属性,还有如果我要在delegate所指向的方法中传递一些参数最好的方法是什么?就是说我要按照一些参数才能正确的更新控件,那么用什么方法才能最好的传递参数给Invoke()方法所在的线程??
      

  3.   

    嗯,并不是说肯定会出问题,而是说可能出问题,而且一旦出了问题都非常古怪你很难找到原因Control.Invoke有两种重载方式,第二种接受一个object[],这里放参数数组
      

  4.   


    通过多线程为基于 .NET 的应用程序实现响应迅速的用户
    http://www.microsoft.com/china/MSDN/library/enterprisedevelopment/softwaredev/misMultithreading.mspx
    你看了这个以后应该问题不大了.