目標是想寫一個控制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());
这些放在循环外面