我在一个winForm界面初始化时要开一个线程执行一个方法,这个方法里面有需要修改控件属性的地方,
我用如下
private void Form1_Load(object sender, EventArgs e)
{
Thread t = new Thread(new ThreadStart(DoWork));
t.Start();
} private void DoWork()
{
MyInvokeDelegate f = new MyInvokeDelegate(TreeBind); tr_ServerList.Invoke(f);//这个是树型控件
}TreeBind()这个方法是对树型控件的数据绑定,因为数据比较多,所以采取多线程,
这样虽然能出来,但是在同出来之前画面是冻结的,不能做任何操作,如果直接用线程执行方法的话又要报错,不知道哪位兄弟有好的解决办法
我用如下
private void Form1_Load(object sender, EventArgs e)
{
Thread t = new Thread(new ThreadStart(DoWork));
t.Start();
} private void DoWork()
{
MyInvokeDelegate f = new MyInvokeDelegate(TreeBind); tr_ServerList.Invoke(f);//这个是树型控件
}TreeBind()这个方法是对树型控件的数据绑定,因为数据比较多,所以采取多线程,
这样虽然能出来,但是在同出来之前画面是冻结的,不能做任何操作,如果直接用线程执行方法的话又要报错,不知道哪位兄弟有好的解决办法
不阻塞主UI线程
这是因为你在LOAD事件里加载数据,
Thread t = new Thread(new ThreadStart(DoWork));
t.Start();
form在等待加载数据的线程执行完成后才会显示出来,
用Backgroundworker类也好,
Thread d=new Thread (new ParameterizedThreadStart (DoWork))
或是
ThreadPool .QueueUserWorkItem (new WaitCallback (DoWork))
意义是一样的,由于单线程单元机制等原因,.net不容许跨线程访问控件,所以最好用委托处理数据加载,
关键是你要在Form1_Load事件里用线程异步的委托来处理,这样达到Form1先显示,又异步的加载里数据到treeview控件
他不是线程耗时,而是那个 TreeBind 方法耗时。但 TreeBind 方法有涉及到 Controls,所以只能够摆在 UI 线程。因此,此问题,我个人认为是无解的啦。或者应该从另外一个角度考虑这个问题, TreeBind 需要一次过绑定那么多数据吗。如果更新界面的方法慢到可以被感觉出来,至少也绑定时一万八千个界面元素在上面,用户一次过看得过那么多?是否可以分开,按需绑定。