知道ThreadPool何时为空

Dar*_*rko 5 c# multithreading backgroundworker threadpool

我似乎无法找到一种简单的方法来确定线程池何时完成所有排队的任务。我在这里找到了一些答案,但没有一个可以帮助我。

为了简单起见,我们说:

for (int i=0;i<10;i++)
{
   threadpool.queueuserworkitem(Go);

}
void Go()
{
   Console.WriteLine("Hello");
}
Run Code Online (Sandbox Code Playgroud)

那么,在所有 10 个后台线程完成后,我该如何发送最终的“全部完成”console.writeline 呢?

谢谢

ogg*_*gre 0

依赖线程池空是不可能的,也是危险的。你能做的就是自己计算你的活动任务。使用监视器的低级方法:

   class Program
    {
        static object _ActiveWorkersLock = new object();
        static int _CountOfActiveWorkers;

        static void Go(object state)
        {
            try
            {
                Console.WriteLine("Hello");
            }
            finally
            {
                lock (_ActiveWorkersLock)
                {
                    --_CountOfActiveWorkers;
                    Monitor.PulseAll(_ActiveWorkersLock);
                }
            }
        }

        static void Main(string[] args)
        {
            for (int i = 0; i < 10; i++)
            {
                lock (_ActiveWorkersLock)
                    ++_CountOfActiveWorkers;
                ThreadPool.QueueUserWorkItem(Go);
            }

            lock (_ActiveWorkersLock)
            {
                while (_CountOfActiveWorkers > 0)
                    Monitor.Wait(_ActiveWorkersLock);
            }

            Console.WriteLine("All done");
        }
    }
Run Code Online (Sandbox Code Playgroud)

  • 但所展示的方法水平较低,可能很困难且容易出错。我建议您坚持使用 PLINQ 和 TPL,如另一个答案中所建议的。这些技术也将为您带来正确的异常处理。 (2认同)