日期:2014-05-17  浏览次数:20782 次

【求助】如何在UI界面中等待另一个线程结束后再继续执行下面的程序,UI界面不能挂死
需求如下:
有一个Form类:UI(主线程)
一个Thread类:ThreadA

现在要求在UI中调用ThreadA,等A调用完成后接着执行UI下面的代码部分,同时这个时候UI界面不能够挂死

读了各种关于委托和INVOKE的内容,大多数是讲怎么跨线程设置控件,我这个感觉相对简单的实现在网上怎么搜也搜不到=。=

试过ThreadA.join(),这个会让界面挂死,不行的
其实线程A的目的就是复制几个文件,如果能做到复制的时候不让界面挂死,不用线程也罢。不过最主要的还是想掌握这种方法

求各位大神支招Orz
等待 线程 结束

------解决方案--------------------
UI又要等,又不想挂起,那只能是做DoEvent
不过这种设计不是很合理,正常应该是后台线程做事,然后通知UI刷新。这样就没有等待这一说了
------解决方案--------------------
其实,不知道你想干什么。
难道你是说的不是异步?
------解决方案--------------------
引用:
UI又要等,又不想挂起,那只能是做DoEvent
不过这种设计不是很合理,正常应该是后台线程做事,然后通知UI刷新。这样就没有等待这一说了

说的很合理,lz这个需求就是有问题的!
------解决方案--------------------
引用:
UI又要等,又不想挂起,那只能是做DoEvent
不过这种设计不是很合理,正常应该是后台线程做事,然后通知UI刷新。这样就没有等待这一说了


+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线程执行完了,才对。

------解决方案--------------------
引用:
能再具体点么?最好有代码什么的
Quote: 引用:

...简单点吧,有封装好的控件。用BackgroundWorker控件执行线程方法。订阅RunWorkerCompleted事件,然后写你想要线程结束后执行的方法。


BackgroundWorker backWork= new BackgroundWorker();
backWork.DoWork += (o, ee) =>
                {
                  复制文件方法;