C#多线程问题,子线程结束后回到主线程。

作者&投稿:希林 (若有异议请与网页底部的电邮联系)
多线程问题,,如何让所有子线程结束后再执行主线程,,要C#~

首先子线程必须由主线程启动,所以严格意义上的“子线程结束后再执行主线程”是不可能实现,你的意思应该是:主线程创建完子线程后,等待子线程退出,在继续执行。

你的代码基本没有多大问题,只是 Join 方法位置放置不对。
thread1.Start(); // 先启动所有子线程
thread2.Start();
thread3.Start();
thread4.Start();
thread5.Start();

thread1.Join(); // 然后在等待子线程退出
thread2.Join();
thread3.Join();
thread4.Join();
thread5.Join();

你先前的代码:
thread1.Start(); // 线程1 启动
thread1.Join(); // 等待 线程1 退出,线程1 未退出前,后面代码无法执行
thread2.Start(); // 以下代码,均同上所述。
thread2.Join();
thread3.Start();
thread3.Join();
thread4.Start();
thread4.Join();

System.Threading.AutoResetEvent wait = new System.Threading.AutoResetEvent(false);
wait.WaitOne();//等待
wait.Set();//让等待的地方继续执行

当然这两个方法要写在不同的线程里面,如果写在一个线程里面
wait.Set();是没机会执行的

首先,我觉得你的方法应该是可以实现你想要的功能的,为此我改写了你的两个处理方法来做测试, 如下:

private void SendAndReceive()
{
    Console.WriteLine("Started sending and recieving...");
    Thread.Sleep(2000);
    Console.WriteLine("Finished sending and recieving...");
}
private void MakeRecord()
{
    Console.WriteLine("Recording...");
}

如果你Debug执行这个程序,可以在输出窗口看到如下输出:

Started sending and recieving...
The thread '<No Name>' (0x1fc4) has exited with code 0 (0x0).
Finished sending and recieving...
Recording...

不知道你的方法里有什么特殊的逻辑。

 

我建议你使用微软提供的专门处理这类情况的对象BackgroundWorker

http://msdn.microsoft.com/en-us/library/vstudio/system.componentmodel.backgroundworker

可以让你更灵活来完成你想要的功能。

当然,还有其他的方法。 具体可以看看多线程相关的对象。

 

下面给你使用BackgroundWorker来完成这个功能的代码,

BackgroundWorker backWorker = new BackgroundWorker();
public DemoForm()
{
    InitializeComponent();
    backWorker.DoWork += backWorker_DoWork;
    backWorker.RunWorkerCompleted += backWorker_RunWorkerCompleted;
}
void backWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
    MakeRecord();
}
void backWorker_DoWork(object sender, DoWorkEventArgs e)
{
    SendAndReceive();
}
private void button_Click(object sender, EventArgs e)
{
    backWorker.RunWorkerAsync();
}

同样可以得到上面的结果:

Started sending and recieving...
Finished sending and recieving...
Recording...



衢州市15391433989: C# 如何控制子线程运行结束后再运行主线程 -
尘养珍稀: java 有一个CountDownLatch类,是专门处理这种问题的..net好像没有这样的类,你搜一下.net CountDownLatch,然后会出现模拟这个类的一些代码.原理基本上就是一开始定义一个CountDownLatch计数器,比如你有两个子线程,那么这个...

衢州市15391433989: 子线程结束了,主线程怎么才能知道? C# -
尘养珍稀: 一个程序从入口函数开始运行,知道运行到末尾的 return结束,程序退出.这是一个很正常的过程,如果你不告诉程序停止向下执行语句,他会始终向下执行直到return.等待事件一般就可以停止运行代码,但是最好不要写在主线程里,容易引...

衢州市15391433989: C#多线程: 怎么知道 多个线程 执行完毕了?所有的线程执行完毕后 我要做处理 -
尘养珍稀: 呃.NET 已经全忘了 JAVA的有,你看看行不 判断所有线程已经结束 可以使用线程等待结束的方法:List threadList = new ArrayList(); for (int j = 0; j < 100; ++j){GetHttpThread t = new GetHttpThread(urlList.get(j).toString()); t.start();threadList.add(t);}...

衢州市15391433989: C# 中如何让 主线程 等待 子线程终止 -
尘养珍稀: 利用异步回调技术,该你个简单的例子./// <summary>/// 开始接收数据/// </summary>/// <returns></returns>public bool StartRevice(){isRevice = false;ReviceDataHandler reviceData = new ReviceDataHandler(IsReviceAll);IAsyncResult ...

衢州市15391433989: C#主线程监听子线程的结束 -
尘养珍稀: 使用异步回调,异步操作(使用线程池中的线程)完成后调用回调函数,在回调函数中修改子线程的操作状态即可.

衢州市15391433989: c#子线程执行完怎么通知主线程 -
尘养珍稀: 定义一个委托实现回调函数 public delegate void CallBackDelegate(string message); 程序开始的时候//把回调的方法给委托变量 CallBackDelegate cbd = CallBack;//启动线程 Thread th = new Thread(Fun); th.Start(cbd);//开始线程,代入参数//...

衢州市15391433989: 如何等待子线程执行完毕 再继续主线程 -
尘养珍稀: 可以添加信号量,在主程序中等待,当子线程全部置过信号量之后,主线程继续执行

衢州市15391433989: C#多线程中子线程快速终止的几个处理办法 -
尘养珍稀: 简单的方法是,Thread.CurrentThread.Abort()用于终止当前线程.当然了,你需求中不但要终止当前线程,还要执行别的业务,弹出form.那么就需要一个新的委托,在线程过程中调用这个委托来终止现成,从而达到在终止线程后执行其他...

衢州市15391433989: C# Thread问题 -
尘养珍稀: 1.线程结束有2种,一种为正常结束,当你的更新完成之后,线程函数执行完了,那么线程就自动结束了.还一种就是thread.Abort();这样代码控制强制结束.2.判断thread.isalive 或者判断thread.ThreadState的返回值3.thread.Abort();强制结束线程或者: while(!bNeedAbort) { //通过控制bNeedAbort来达到退出循环的效果 }4.=true意味着这个线程是后台线程,当主程序关闭的时候,此线程会自动关闭.反之……,默认状态为false.

衢州市15391433989: c#多线程如何才能访问到主线程内的变量 -
尘养珍稀: 可以用事件来完成,当子线程完成工作后,触发事件,主线程接到后,做出相应的反应即事件方法.

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网