等待所有线程结束后,主线程才退出

liyoubaidu 2009-12-19 11:01:43
console程序:

main()
{
for(int i=0;i<100;i++)
{
用线程池开启一个新线程;
}

等待上面开启的所有线程执行完后,才继续往下面执行。//这一句要怎么实现。
}
...全文
664 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
88csdn 2010-03-07
  • 打赏
  • 举报
回复
呵呵,最好就是信号量了,要不就写个while(...){sleep(1000);}但是这样不推荐哦
liyoubaidu 2010-03-07
  • 打赏
  • 举报
回复
还有没有其他的解决方案呢。
dc212009 2010-02-05
  • 打赏
  • 举报
回复
用类似信号量的东西ManualResetEvent,
来控制吧。
barbara2008 2010-02-05
  • 打赏
  • 举报
回复
设置一个事件
liyoubaidu 2010-02-04
  • 打赏
  • 举报
回复
up
ProjectDD 2009-12-20
  • 打赏
  • 举报
回复
//MSDN :
//注意看 ThreadPool如何实例化的,以及 WaitAll();静态方法的调用 这就是你要的等待所有线程完成的阻塞。
using System;
using System.Threading;

public sealed class App
{
// Define an array with two AutoResetEvent WaitHandles.
static WaitHandle[] waitHandles = new WaitHandle[]
{
new AutoResetEvent(false),
new AutoResetEvent(false)
};

// Define a random number generator for testing.
static Random r = new Random();

static void Main()
{
// Queue up two tasks on two different threads;
// wait until all tasks are completed.
DateTime dt = DateTime.Now;
Console.WriteLine("Main thread is waiting for BOTH tasks to complete.");
ThreadPool.QueueUserWorkItem(new WaitCallback(DoTask), waitHandles[0]);
ThreadPool.QueueUserWorkItem(new WaitCallback(DoTask), waitHandles[1]);
WaitHandle.WaitAll(waitHandles);
// The time shown below should match the longest task.
Console.WriteLine("Both tasks are completed (time waited={0})",
(DateTime.Now - dt).TotalMilliseconds);

// Queue up two tasks on two different threads;
// wait until any tasks are completed.
dt = DateTime.Now;
Console.WriteLine();
Console.WriteLine("The main thread is waiting for either task to complete.");
ThreadPool.QueueUserWorkItem(new WaitCallback(DoTask), waitHandles[0]);
ThreadPool.QueueUserWorkItem(new WaitCallback(DoTask), waitHandles[1]);
int index = WaitHandle.WaitAny(waitHandles);
// The time shown below should match the shortest task.
Console.WriteLine("Task {0} finished first (time waited={1}).",
index + 1, (DateTime.Now - dt).TotalMilliseconds);
}

static void DoTask(Object state)
{
AutoResetEvent are = (AutoResetEvent) state;
int time = 1000 * r.Next(2, 10);
Console.WriteLine("Performing a task for {0} milliseconds.", time);
Thread.Sleep(time);
are.Set();
}
}

// This code produces output similar to the following:
//
// Main thread is waiting for BOTH tasks to complete.
// Performing a task for 7000 milliseconds.
// Performing a task for 4000 milliseconds.
// Both tasks are completed (time waited=7064.8052)
//
// The main thread is waiting for either task to complete.
// Performing a task for 2000 milliseconds.
// Performing a task for 2000 milliseconds.
// Task 1 finished first (time waited=2000.6528).
photoplan 2009-12-19
  • 打赏
  • 举报
回复
查查 WaitHandle
starj1 2009-12-19
  • 打赏
  • 举报
回复
轮询吧,看每个线程的ThreadState。用Thread.Join()是不现实的。
  • 打赏
  • 举报
回复
Thread.join()

110,533

社区成员

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

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

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