线程的代码最好就是底层的,我意思是不要带有界面色彩的,这样会和界面层的控件的事件出问题的,这是我项目经理说的,有谁有解决方法,也给个个DEMO我吧,[email protected]
多谢了

解决方案 »

  1.   

    sendmessage,postmessage那些API比较合用
      

  2.   

    从线程操作控件请参见多线程处理最适合于运行类模块的处理器密集型过程。与其他组件不同的是,从单独的线程直接调用控件中的方法会存在一些问题。影响控件的方法只应该在创建控件的线程上执行。由于从一个线程封送调用并跨线程边界将其发送到另一个线程会耗费大量的系统资源,所以应避免重复调用其他线程上的控件。在最佳情况下,从其他线程直接进行调用将耗费大量资源,进而使应用程序的性能受损。在最坏的情况下,将发生导致应用程序中出现死锁的情况,进而使执行冻结。不过,在有些情况下,您可能需要通过线程调用控件的方法。例如,您可能要在窗体上调用一个禁用按钮或更新显示的方法来响应某个线程执行的操作。.NET Framework 提供从任何线程都可安全调用的方法,以调用与其他线程所拥有的控件进行交互的方法。Control.Invoke 方法允许同步执行控件上的方法,而 Control.BeginInvoke 方法则初始化异步执行。要使用这些方法,必须用与将调用的方法相同的签名声明委托。然后,您可以通过向要调用的方法提供适当的委托来调用窗体上任何控件的 Invoke 或 BeginInvoke 方法。任何必需的参数都包装在 Object 中,并被传输到该方法。调用涉及其他线程所拥有的控件的方法 用与要调用的方法相同的签名声明一个委托。 
    下面的示例显示如何使用 Integer 和 String 参数声明委托。 // C#
    public delegate void myDelegate(int anInteger, string aString);
    使用任何控件来调用对其他线程所拥有的控件进行操作的方法。 
    注意   方法所需的参数(如果有)可在 Object 中提供。
    如果要同步调用方法,请调用 Control.Invoke 方法。 // C#
    Label1.Invoke(new myDelegate(myMethod), new Object[] {1,
       "This is the string"});
    如果要异步调用方法,请调用 Control.BeginInvoke 方法。 // C#
    Label1.BeginInvoke(new myDelegate(myMethod), new 
    Object[] {1, "This is the string"});
      

  3.   

    一般来说线程对简单控件是可以操作的,但是对于像listView,DataGrid这样的控件就不可以了.有的时候完全可以用异步来操作,但是异步有时也会存在这样的问题,所以如果是复杂控件又要在线程中操作控件时最好想办法换个思路,因为往往这样想时是在编程思路上存在着其它的做法.
      

  4.   

    参见我写的代码http://community.csdn.net/Expert/topic/3357/3357352.xml?temp=.7726099