日期:2014-05-19  浏览次数:21044 次

如何等待子线程执行完毕 再继续主线程?
各位好,
本来就是一个单线程程序,
  private   void   btnStartRun_Click(object   sender,   EventArgs   e)
{
    CurrentobjCalpuff.selectPoint   =   alPoint;
    CurrentobjCalpuff.selectLine   =   alLine;
    CurrentobjCalpuff.selectArea   =   alArea;
    CurrentobjCalpuff.CreatePuffInp();
    CurrentobjCalpuff.StartCalpuff();   //执行时间大约为20分钟
    CurrentobjCalpuff.StartCalpost();
}

这样的话vs2005是抱错的,说执行时间不能超过60秒,在网上搜索了一下,说用多线程可以解决这个问题,因此改为:
  private   void   btnStartRun_Click(object   sender,   EventArgs   e)
{
  CurrentobjCalpuff.selectPoint   =   alPoint;
  CurrentobjCalpuff.selectLine   =   alLine;
  CurrentobjCalpuff.selectArea   =   alArea;

  CurrentobjCalpuff.CreatePuffInp();

  Thread.CurrentThread.Suspend();
  Thread   thd   =   new   Thread(new   ThreadStart(doEvent));
  thd.IsBackground   =   true;
  thd.Start();

  if   (!thd.IsAlive)
        {  
              Thread.CurrentThread.Resume();  
        }
    CurrentobjCalpuff.StartCalpost();
}

  private   void   doEvent()
                {                      
                        CurrentobjCalpuff.StartCalpuff();
                }

可编译时说suspend已过时,且运行时好像没有达到目的,小弟初次接触多线程,不知道如何实现这一要求,望大家提供最简单的方法,解决马上结帖,谢谢!!!!

------解决方案--------------------
用 BackgroundWorker 来实现后台线程
MSDN 有详细示例
------解决方案--------------------
Thread.Join
------解决方案--------------------
阻塞 Jiong

挂起 suspend
------解决方案--------------------
thread.Join把指定的线程加入到当前线程,合并为单线程
比如说
thread1.Start();
thread1.Join();
这样的话,当前线程就会等thread1执行完后再执行
具体例子,你查一些MSDN中thread.Join的用法吧
------解决方案--------------------
Join()
------解决方案--------------------
我有个Splash界面,其中有个初始化的工作,成功才能启动主窗体,下面是主窗体中的代码。
private void StartSplash()
{
while(true)
{
//通过静态变量IniSuccessFlag判断子线程是否执行成功,不成功则继续等待
if(fmSplash.IniSuccessFlag == false)
{
Thread.Sleep(2000);
}
else
{
你自己的操作。。。。。。
}
}
}
------解决方案--------------------
挂起 suspend
------解决方案--------------------
如果没记错的话,thread是有一个complete事件的,如果没有backgroundworker肯定是有的
你把CurrentobjCalpuff.StartCalpost();防在事件中执行