我有一个控制台应用程序,它会生成一些线程,然后退出。每个线程大约需要大约20秒才能完成。似乎控制台应用程序正在生成线程,然后在线程有机会完成之前退出。
如果控制台应用程序产生的所有线程都已完成,我怎么告诉控制台应用程序不要退出?
答案 0 :(得分:6)
是否为循环产生了线程?如果是这样,Parallel.ForEach将起作用:
ParallelOptions options = new ParallelOptions();
Parallel.ForEach(items, options, item=>
{
// Do Work here
}
});
答案 1 :(得分:6)
您可以使用CountDownEvent
。
using System;
using System.Collections.Generic;
using System.Threading;
namespace ConsoleApplication1
{
class Program
{
static CountdownEvent countdown;
static void Main(string[] args)
{
countdown = new CountdownEvent(1);
for (int i = 1; i < 5; i++)
{
countdown.AddCount(); //add a count for each (BEFORE starting thread .. Thanks, Brian!)
//do stuff to start background thread
}
countdown.Signal(); //subtract your initial count
countdown.Wait(); //wait until countdown reaches zero
//done!
}
static void backgroundwork()
{
//work
countdown.Signal(); //signal this thread's completion (subtract one from count)
}
}
}
答案 2 :(得分:2)
只要Thread
不是后台线程(.IsBackground
),应用就应该保持活力:
static void Main()
{
Thread thread = new Thread(MoreStuff);
thread.IsBackground = false;
thread.Start();
Console.WriteLine("Main thread exiting");
}
static void MoreStuff()
{
Console.WriteLine("Second thread starting");
Thread.Sleep(5000); // simulate work
Console.WriteLine("Second thread exiting");
}
不需要其他任何东西。请注意,ThreadPool
将使用后台线程;问题或许是你在这里使用ThreadPool
?
注意:如果第二个线程实际上没有启动,那么可能是一个可以过早退出的小型竞赛;你可能想要开始开始。
答案 3 :(得分:1)
您可以使用Thread.Join
等待线程完成。
答案 4 :(得分:1)
你是如何推出线程的?这实际上取决于,但如果你只是使用Thread类,那么从主线程调用yourThread[i].Join()
以确保所有线程都完成。
调查Tasks and Task Factory以便比过去几年更清洁地处理事情。
答案 5 :(得分:1)
在您启动后启动的所有线程上调用Thread.Join()
。这将阻塞当前线程,直到线程完成。
答案 6 :(得分:0)
您应该使用同步并等待任何生成的线程完成其工作,方法是通过调用Thread.Join或使用信号阻塞主线程(例如使用Monitor或其他选项之一)。 / p>
或者,您可以通过设置IsForeground属性(afaicr)将生成的线程作为前台线程运行。这将使应用程序保持活动状态,直到线程终止,但您仍会看到控制台窗口在主线程退出时消失。