日期:2014-05-19  浏览次数:20743 次

C#中,有什么技术可以将多线程应用在界面绘制上?
因为.net中提供的gui库不允许跨线程操作,所以当用户界面上的控件一多起来之后,gui反映速度就会急剧下降,双缓冲等一般手段完全不起作用。现在有2个问题请教各位:

当界面上会有很多控件时,
1.   如果这些控件有部分分布在可见区域之外,如何取消它们的绘制?(因为不在可见区域内,画出来也看不见)

2.   如果这些控件全部都处于可见状态,如何提高绘制速度?


另外,提供一个比较具体的例子,属于第一种情况:

class   复合控件   :   UserControl
{
    private   System.Windows.Forms.许多控件;

    private   void   InitializeComponent()
    {
        许多控件   =   new   许多控件();
        许多控件.许多属性   =   各自的属性设置;
        this.Controls.Add(   各种容器   );
        各种容器.Controls.Add(   许多控件   );
    }

    public   复合控件()
    {
        InitializeComponent();     //     这个过程相当耗时间
    }
}  

class   Form1   :   Form
{
    private   System.Windows.Forms.Form里的许多控件;

    private   void   InitializeComponent()     //     这个过程相当耗时间
    {
        Form里的许多控件   =   new   Form里的许多控件();
        Form里的许多控件.许多属性   =   各自的属性设置;
        this.Controls.Add(   Form里的各种容器   );
        Form里的各种容器.Controls.Add(   Form里的许多控件   );
    }

    public   Form1()
    {
        InitializeComponent();

        this.某容器控件.SuspendLayout();
        for   (int   i=0;   i <某个数;   ++i)
        {
            复合控件   c   =   new   复合控件();
            c.Location   =   new   Point(   i   *   (   c.Width   +   3   ),   0   );
            //   这里是横向排列扩展。
            //   根据需要也可能会是纵向排列的控件,
            //   但是一定都会使后面加入的控件超出可见区域,
            //   这时候外面的容器控件会出现滚动条。

            this.某容器控件.Controls.Add(   c   );
        }
        this.某容器控件.ResumeLayout();

        //   前面这个循环相当耗时,当   Form1   还没有显示出来的时候(也就是说
        //   类似的工作是在   Form1   的构造函数或者   Load   事件中进行),可以用
        //   Splash   之类的东西挡一挡,但是这个过程太长的话用户会产生反感。

        //   而且,最重要的是,当主界面的   gui   上加入了这么多控件之后,程序
        //   的   gui   重绘明显会变得很慢,即使开了双缓冲也起不到明显的效果,
        //   甚至是完全看不出效果。但是这个过程又不能用   BackgroundWorker
        //   之类的手段放到后台线程完成。

        //   请问诸位高手有什么好的办法可以解决吗?
    }
}


------解决方案--------------------
因为.net中提供的gui库不允许跨线程操作
------------------

跨线程更新ui在2.0中需要用invoke方法

private void Form1_Load(object sender, EventArgs e)
{