Below is a simple code demo of this problem, just execute StartQueueJob()
and then ShowResult()
after few seconds,
here I list some test results after several tests:
1. Loop count: 1000, For count: 1000, Thread count: 999, Data.Count: 999
2. Loop count: 1000, For count: 1000, Thread count: 990, Data.Count: 992
3. Loop count: 5000, For count: 5000, Thread count: 4534, Data.Count: 4527
4. Loop count: 7, For count: 7, Thread count: 7, Data.Count: 7
5. Loop count: 7, For count: 7, Thread count: 6, Data.Count: 6
Tested on a 8 cores CPU Win7 64bit PC, .Net Framework 4.0 VS2010 pro. Functions were triggered by mouse click myself, I click a button to run StartQueueJob()
and then click to run ShowResult()
after few seconds.
I have 2 questions:
Why sometimes Thread count != Data.Count?
Why sometimes Thread count < For count?
List<int> Data = new List<int>();
int ForCount = 0;
int ThreadCount = 0;
private void StartQueueJob( )
{
int iLoop = Convert.ToInt32(numericUpDown2.Value);
Data = new List<int>(iLoop);
ForCount = 0;
ThreadCount = 0;
for (int k = 0; k < iLoop; k++)
{
ForCount += 1;
ThreadPool.QueueUserWorkItem(
(obj) =>
{
ThreadCount++;
Data.Add(ThreadCount);
});
}
}
private void ShowResult()
{
Console.WriteLine(String.Format(
"Loop count: {3}, For count: {0}, Thread count: {1}, Data.Count: {2} ",
new object[] { ForCount, ThreadCount, Data.Count, numericUpDown2.Value }));
}