【求助】如何在UI界面中等待另一个线程结束后再继续执行下面的程序,UI界面不能挂死
需求如下:
有一个Form类:UI(主线程)
一个Thread类:ThreadA
现在要求在UI中调用ThreadA,等A调用完成后接着执行UI下面的代码部分,同时这个时候UI界面不能够挂死
读了各种关于委托和INVOKE的内容,大多数是讲怎么跨线程设置控件,我这个感觉相对简单的实现在网上怎么搜也搜不到=。=
试过ThreadA.join(),这个会让界面挂死,不行的
其实线程A的目的就是复制几个文件,如果能做到复制的时候不让界面挂死,不用线程也罢。不过最主要的还是想掌握这种方法
求各位大神支招Orz
------解决方案--------------------UI又要等,又不想挂起,那只能是做DoEvent
不过这种设计不是很合理,正常应该是后台线程做事,然后通知UI刷新。这样就没有等待这一说了
------解决方案--------------------其实,不知道你想干什么。
难道你是说的不是异步?
------解决方案--------------------
说的很合理,lz这个需求就是有问题的!
------解决方案--------------------
+1
public bool running = false;
public void Foo()
{
new Thread((ThreadStart)delegate
{
running = true;
//some code to delay
running = false;
}.Start();//模拟你线程
while(running)
{
Application.DoEvents();
Thread.Sleep(1);
}
}
------解决方案--------------------...简单点吧,有封装好的控件。用BackgroundWorker控件执行线程方法。订阅RunWorkerCompleted事件,然后写你想要线程结束后执行的方法。
------解决方案--------------------楼主的需求并不奇怪,我有做过类似的程序,实现的东西如下:
全国有很多销售点,
1、要统计各大区的销售情况
2、要汇总全国产品的总销售量。
因为点多、量大,单一线程计算缓慢,而且远程取数会因为网络原因,可能不能一次性取全。
使用线程池计算,单一线程汇总一地区数据,大区中的所有地区计算完毕后才能计算该大区销售量,
当所有大区销售量统计完成后,才能计算全国销售量。点击计算,UI出现Loding... 这个时候你
可以做点其他不想干的事情。当完成后,“当”一下,提醒你。
楼主的问题重点应该是
B线程怎么知道A线程执行完了,才对。
------解决方案--------------------
BackgroundWorker backWork= new BackgroundWorker();
backWork.DoWork += (o, ee) =>
{
复制文件方法;