C#.Net 4.0控制台应用程序-如何在所有线程完成之前保持活动状态
本文关键字:线程 活动状态 Net 控制台 应用程序 | 更新日期: 2023-09-27 17:54:53
可能重复:
C#:等待所有线程完成
我有一个控制台应用程序,它生成一些线程,然后退出。每个线程大约需要20秒才能完成。控制台应用程序似乎正在生成线程,然后在线程有机会完成之前退出。
我如何告诉控制台应用程序在它生成的所有线程完成之前不要退出?
您可以使用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)
}
}
}
线程是为循环派生的吗?如果是这样的话,Parallel.ForEach会起作用:
ParallelOptions options = new ParallelOptions();
Parallel.ForEach(items, options, item=>
{
// Do Work here
});
只要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
吗?
注意:如果第二个线程实际上还没有开始,那么可能是一个小的竞争,它可能会提前退出;您可能希望从开始选通线程。
您可以使用Thread.Join
来等待线程完成。
如何启动线程?这确实取决于情况,但如果您只是使用Thread类,那么从主线程调用yourThread[i].Join()
以确保所有线程都完成。
查看任务和任务工厂,可以比过去几年更干净地处理事情。
在所有启动的线程上调用Thread.Join()
。这将阻塞当前线程,直到线程完成。
您可能应该使用同步并等待任何派生线程完成它们的工作,方法是通过调用thread.Join或使用信号(例如使用监视器或其他选项(来阻止主线程。
或者,您可以通过设置IsForeground属性(afaicr(,简单地使派生的线程作为前台线程运行。这将使应用程序保持活动状态,直到线程终止,但当主线程退出时,您仍然会看到控制台窗口消失。