C#.Net 4.0控制台应用程序-如何在所有线程完成之前保持活动状态

本文关键字:线程 活动状态 Net 控制台 应用程序 | 更新日期: 2023-09-27 17:54:53

可能重复:
C#:等待所有线程完成

我有一个控制台应用程序,它生成一些线程,然后退出。每个线程大约需要20秒才能完成。控制台应用程序似乎正在生成线程,然后在线程有机会完成之前退出。

我如何告诉控制台应用程序在它生成的所有线程完成之前不要退出?

C#.Net 4.0控制台应用程序-如何在所有线程完成之前保持活动状态

您可以使用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(,简单地使派生的线程作为前台线程运行。这将使应用程序保持活动状态,直到线程终止,但当主线程退出时,您仍然会看到控制台窗口消失。