求助:task 控制數量時Task.WaitAny看起來沒有釋放

目標是想寫一個控制task控制數量的程序,自己手工控制task數量

問題點:(如程序執行的結果示例)
我的理解是Task.WaitAny會等待任何一個任務結束,當任務結束時,也就意味著curTaskNum會減1,但是不明白while循環中的內容為什麼會出現這麼多次
图片说明

代碼如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Collections;
using System.Threading;

namespace 語句測試
{
    public class t22_multinsert2
    {
        public void syndata()
        {
            int maxTaskNum = 5;//設置最大任務數量
            int curTaskNum = 0;//記錄當前的任務數量
            var tasklist = new List<Task>();//存放任務列表
            for (int i=0;i<15;i++)
            {

                Console.WriteLine("進入循環體"+i.ToString());
                Interlocked.Increment(ref curTaskNum);
                Console.WriteLine("Interlocked.Increment :" + curTaskNum.ToString());
                //啟動任務之前,將curTaskNum+1,預計的是任務執行完成后curTaskNum-1
                var task = Task.Factory.StartNew(()=> {
                                                            insertData();
                    Interlocked.Decrement(ref curTaskNum);
                    Console.WriteLine("Interlocked.Decrement :" + curTaskNum.ToString());
                }).ContinueWith(t=> {

                });

                tasklist.Add(task);

                //判斷只在執行的任務數量是否超過設定的最大任務數量,如果超過,則等待任務的結束
                //
                while (curTaskNum > maxTaskNum)
                {

                    Console.WriteLine("curTaskNum:" + curTaskNum.ToString()+ "   maxTaskNum:" + maxTaskNum.ToString());

                    //for (int j = 0; j < tasklist.Count; j++)
                    //{
                    //    if (tasklist[j].IsCompleted == true)
                    //    {
                    //        Console.WriteLine("第" + j.ToString() + "個任務已完成,從數組列表中移除");
                    //        tasklist.Remove(tasklist[j]);
                    //    }
                    //}
                    Console.WriteLine("task的任務超過了5個,正在等待釋放");
                     Task.WaitAny(tasklist.ToArray());
                    Console.WriteLine("wait any釋放了task,curTaskNum: " + curTaskNum.ToString());
                }
            }

            Console.WriteLine("任務列表一共有 "+tasklist.Count.ToString());
            Console.WriteLine("等待所有的任務完成");
            Task.WaitAll(tasklist.ToArray()); //等待所有的任務全部執行完成。
            Console.WriteLine("所有的任務已完成");

        }
        public void insertData()
        {
            Thread.Sleep(5000);
            Console.WriteLine("insert data");

        }
    }
}

            var task = Task.Factory.StartNew(()=> {
                                                        insertData();
                Interlocked.Decrement(ref curTaskNum);
                Console.WriteLine("Interlocked.Decrement :" + curTaskNum.ToString());
            }).ContinueWith(t=> {

            });

            tasklist.Add(task);

                             Task.WaitAll(tasklist.ToArray()); 
        这些放在循环外面