如何等待子线程执行完毕 再继续主线程?

comflyer0590 2007-04-03 09:24:32
各位好,
本来就是一个单线程程序,
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已过时,且运行时好像没有达到目的,小弟初次接触多线程,不知道如何实现这一要求,望大家提供最简单的方法,解决马上结帖,谢谢!!!!
...全文
1104 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
zl194 2010-01-06
  • 打赏
  • 举报
回复
XX
Nick_Nick 2007-04-04
  • 打赏
  • 举报
回复
如果没记错的话,thread是有一个complete事件的,如果没有backgroundworker肯定是有的
你把CurrentobjCalpuff.StartCalpost();防在事件中执行
zhangliu_521 2007-04-04
  • 打赏
  • 举报
回复
挂起 suspend
liutaoyue 2007-04-04
  • 打赏
  • 举报
回复
我有个Splash界面,其中有个初始化的工作,成功才能启动主窗体,下面是主窗体中的代码。
private void StartSplash()
{
while(true)
{
//通过静态变量IniSuccessFlag判断子线程是否执行成功,不成功则继续等待
if(fmSplash.IniSuccessFlag == false)
{
Thread.Sleep(2000);
}
else
{
你自己的操作。。。。。。
}
}
}
comflyer0590 2007-04-03
  • 打赏
  • 举报
回复
根据各位的帮助 我已经把thread1.Join();加入 达到了预期的目的 但是不大好的就是在运行子线程时主线程(主界面)就没有反应 像死了一样 有啥办法让主线程所在的ui界面快速反应吗? 不影响子线程的执行。
JavaK 2007-04-03
  • 打赏
  • 举报
回复
Join()
cctaiyang 2007-04-03
  • 打赏
  • 举报
回复
thread.Join把指定的线程加入到当前线程,合并为单线程
比如说
thread1.Start();
thread1.Join();
这样的话,当前线程就会等thread1执行完后再执行
具体例子,你查一些MSDN中thread.Join的用法吧
江城老温 2007-04-03
  • 打赏
  • 举报
回复
阻塞 Jiong

挂起 suspend
cctaiyang 2007-04-03
  • 打赏
  • 举报
回复
Thread.Join
vengair 2007-04-03
  • 打赏
  • 举报
回复
用 BackgroundWorker 来实现后台线程
MSDN 有详细示例
comflyer0590 2007-04-03
  • 打赏
  • 举报
回复
add:
我两段代码运行60秒后都报同样的错:
"CLR 无法从 COM 上下文 0x1a2008 转换为 COM 上下文 0x1a2178,这种状态已持续 60 秒。拥有目标上下文/单元的线程很有可能执行的是非泵式等待或者在不发送 Windows 消息的情况下处理一个运行时间非常长的操作。这种情况通常会影响到性能,甚至可能导致应用程序不响应或者使用的内存随时间不断累积。要避免此问题,所有单线程单元(STA)线程都应使用泵式等待基元(如 CoWaitForMultipleHandles),并在运行时间很长的操作过程中定期发送消息。"

110,533

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧