在C#中有效管理线程

dea*_*ock 1 c# multithreading

我有一个应用程序,用户将选择执行许多任务以及最大线程数.每个任务应该在一个单独的线程上运行.这是我正在寻找的:

如果用户指定"n小于t",其中n是最大线程数,t是任务数.程序应运行"n"个线程,完成后,应通过某种方式通知程序并重复循环,直到完成所有任务.

我的问题是:如何知道所有正在运行的线程已完成其工作,以便我可以重复循环.

Jul*_*iet 10

我建议使用ThreadPool完成任务.它的算法通常比你可以手动滚动的效率更高.

现在,当所有线程完成时,有趣的部分会收到通知.除非你有真正特定的需求使这个解决方案不合适,否则应该很容易用CountdownEvent类实现,这是一种特殊的等待句柄,等待它被发出信号的n时间.这是一个例子:

using System;
using System.Linq;
using System.Threading;
using System.Diagnostics;

namespace CSharpSandbox
{
    class Program
    {
        static void SomeTask(int sleepInterval, CountdownEvent countDown)
        {
            try
            {
                // pretend this did something more profound
                Thread.Sleep(sleepInterval);
            }
            finally
            {
                // need to signal in a finally block, otherwise an exception may occur and prevent
                // this from being signaled
                countDown.Signal();
            }
        }

        static CountdownEvent StartTasks(int count)
        {
            Random rnd = new Random();

            CountdownEvent countDown = new CountdownEvent(count);

            for (int i = 0; i < count; i++)
            {
                ThreadPool.QueueUserWorkItem(_ => SomeTask(rnd.Next(100), countDown));
            }

            return countDown;
        }

        public static void Main(string[] args)
        {
            Console.WriteLine("Starting. . .");
            var stopWatch = Stopwatch.StartNew();
            using(CountdownEvent countdownEvent = StartTasks(100))
            {
                countdownEvent.Wait();
                // waits until the countdownEvent is signalled 100 times
            }
            stopWatch.Stop();
            Console.WriteLine("Done! Elapsed time: {0} milliseconds", stopWatch.Elapsed.TotalMilliseconds);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 我知道你会按照我想要的方式回答这个问题.谢谢朱丽叶. (2认同)