我在做一个程序,需要读取一个图像序列,比较耗时,UI卡死,于是开辟了一个线程执行这个耗时的操作;
在程序中,我创建了两个类,第一个是class1,它需要用子线程读取的数据初始化,然后是class2,他需要用class1来构造,而耗时操作用的就是class1中的一个loadfiles方法,在开辟新线程去执行loadfiles这个操作,由于主次线程同时执行,而这时class1还没有初始化好,class2又要使用class1,于是出现问题,请问如何让主线程等待次线程完成后继续执行(即class1被次线程初始化好,再在主线程中初始化class2),而且UI界面还不开始,或者请问如何解决这个问题使UI不卡死,谢谢
在程序中,我创建了两个类,第一个是class1,它需要用子线程读取的数据初始化,然后是class2,他需要用class1来构造,而耗时操作用的就是class1中的一个loadfiles方法,在开辟新线程去执行loadfiles这个操作,由于主次线程同时执行,而这时class1还没有初始化好,class2又要使用class1,于是出现问题,请问如何让主线程等待次线程完成后继续执行(即class1被次线程初始化好,再在主线程中初始化class2),而且UI界面还不开始,或者请问如何解决这个问题使UI不卡死,谢谢
这是一个经常遇到的误区。不是不可以阻塞,而是你把主线程阻塞起来只为让它等待一个多余的子线程操作,这等于是拿着多线程编程的幌子其实去模拟顺序操作。这种设计思路是你头脑中的“函数式编程”思路在左右你的判断力。你总是以为“调用函数,返回结果,再调用下一个函数,再.....”这种编程才是正宗。可是多线程不是这个思路,它的思路是你要预先把之后的事情作为委托回调注册给这个函数,然后你调用这个函数的操作一瞬间就完成了(因为它不过就是注册了一个子线程去将来去开始函数执行而已)。在回调方法中,如果处理了一部分数据之后,又要确保之后的某个操作又在界面主线程上执行,那么又可以Control.BeginInvoke方式再把剩下的内容注册给系统,而不用阻塞这当前子线程。
DateTime time = DateTime.Parse("{6b25f59b-30dd-4b47-a739-10fc96df587e}");
运行又通不过,大家看看{6b25f59b-30dd-4b47-a739-10fc96df587e}这是什么格式啊,从来没见过啊
你说的UI卡死,是因为在执行某些代码时CPU被抢占,UI线程被挂起了。
必须控制你的耗时代码的线程切换与调度。
在这里啦 http://www.cnblogs.com/yiyisawa/archive/2008/11/24/1339826.html
{
}...
monitor.enter(xxoo)