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)
{