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

时间:2011-05-05 18:30:42

标签: c# multithreading .net-4.0 console-application

  

可能重复:
  C#: Waiting for all threads to complete

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

如果控制台应用程序产生的所有线程都已完成,我怎么告诉控制台应用程序不要退出?

7 个答案:

答案 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)将生成的线程作为前台线程运行。这将使应用程序保持活动状态,直到线程终止,但您仍会看到控制台窗口在主线程退出时消失。