Taken from an answer to one of my previous questions (Task.Factory.StartNew starts with a great delay despite having available threads in threadpool):
"It's not the MAX worker threads value you need to look at - it's the MIN value you get via ThreadPool.GetMinThreads(). The max value is the absolute maximum threads that can be active. The min value is the number to always keep active. If you try to start a thread when the number of active threads is less than max (and greater than min) you'll see a 2 second delay."
So, I've prepared a sample code to test it:
ThreadPool.GetMinThreads()
returns "8" for my machine, and I run the code on my local machine.
My code looks as following:
Task task = null;
int workerThreads = 0;
int completionPortThreads = 0;
ThreadPool.GetMinThreads(out workerThreads, out completionPortThreads);
Logger.WriteInfo(LogCode.EMPTY_INFO, workerThreads.ToString());**returns "8"**
Logger.WriteInfo(LogCode.EMPTY_INFO, "before thread1");
task = Task.Factory.StartNew(() =>
{
Logger.WriteInfo(LogCode.EMPTY_INFO, "after thread1");
while (true)
{
DoSomthing();
}
});
Logger.WriteInfo(LogCode.EMPTY_INFO, "before thread2");
task = Task.Factory.StartNew(() =>
{
Logger.WriteInfo(LogCode.EMPTY_INFO, "after thread2");
while (true)
{
DoSomthing();
}
});
;
Logger.WriteInfo(LogCode.EMPTY_INFO, "before thread3");
task = Task.Factory.StartNew(() =>
{
Logger.WriteInfo(LogCode.EMPTY_INFO, "after thread3");
while (true)
{
DoSomthing();
}
});
Logger.WriteInfo(LogCode.EMPTY_INFO, "before thread4");
task = Task.Factory.StartNew(() =>
{
Logger.WriteInfo(LogCode.EMPTY_INFO, "after thread4");
while (true)
{
DoSomthing();
}
});
Logger.WriteInfo(LogCode.EMPTY_INFO, "before thread5");
task = Task.Factory.StartNew(() =>
{
Logger.WriteInfo(LogCode.EMPTY_INFO, "after thread5");
while (true)
{
DoSomthing();
}
});
Logger.WriteInfo(LogCode.EMPTY_INFO, "before thread6");
task = Task.Factory.StartNew(() =>
{
Logger.WriteInfo(LogCode.EMPTY_INFO, "after thread6");
while (true)
{
DoSomthing();
}
});
Logger.WriteInfo(LogCode.EMPTY_INFO, "before thread7");
task = Task.Factory.StartNew(() =>
{
Logger.WriteInfo(LogCode.EMPTY_INFO, "after thread7");
while (true)
{
DoSomthing();
}
});
Logger.WriteInfo(LogCode.EMPTY_INFO, "before thread8");
task = Task.Factory.StartNew(() =>
{
Logger.WriteInfo(LogCode.EMPTY_INFO, "after thread8");
while (true)
{
DoSomthing();
}
});
Logger.WriteInfo(LogCode.EMPTY_INFO, "before thread9");
task = Task.Factory.StartNew(() =>
{
Logger.WriteInfo(LogCode.EMPTY_INFO, "after thread9");
while (true)
{
DoSomthing();
}
});
Logger.WriteInfo(LogCode.EMPTY_INFO, "before thread10");
task = Task.Factory.StartNew(() =>
{
Logger.WriteInfo(LogCode.EMPTY_INFO, "after thread10");
while (true)
{
DoSomthing();
}
});
Logger.WriteInfo(LogCode.EMPTY_INFO, "before thread11");
task = Task.Factory.StartNew(() =>
{
Logger.WriteInfo(LogCode.EMPTY_INFO, "after thread11");
while (true)
{
DoSomthing();
}
});
Logger.WriteInfo(LogCode.EMPTY_INFO, "before thread12");
task = Task.Factory.StartNew(() =>
{
Logger.WriteInfo(LogCode.EMPTY_INFO, "after thread12");
while (true)
{
DoSomthing();
}
});
Logger.WriteInfo(LogCode.EMPTY_INFO, "before thread13");
task = Task.Factory.StartNew(() =>
{
Logger.WriteInfo(LogCode.EMPTY_INFO, "after thread13");
while (true)
{
DoSomthing();
}
});
private void DoSomthing()
{
int j = 1;
for (int i = 0; i < 2000; i++)
{
j = i * i;
}
}
The Logger class just uses log4net.dll. So, ThreadPool.GetMinThreads() returns 8 for my machine. The min value is the number to always keep active. If you try to start a thread when the number of active threads is less than max (and greater than min) you'll see a 2 second delay.
So, for thread number 9 and so on:
Logger.WriteInfo(LogCode.EMPTY_INFO, "before thread9");
task = Task.Factory.StartNew(() =>
{
Logger.WriteInfo(LogCode.EMPTY_INFO, "after thread9");
while (true)
{
DoSomthing();
}
});
I expect there to be a delay of 2 seconds between
Logger.WriteInfo(LogCode.EMPTY_INFO, "before thread9");
and
Logger.WriteInfo(LogCode.EMPTY_INFO, "after thread9");
because I try to start a thread (from thread pool) when the number of active threads is greater than min (greater than 8). The actual result is that there is just a delay of like a few little milliseconds (less than half a second) for all of thread 9 till 13.
Why isn't there a delay of 2 seconds at least? I mean, all the active threads in my thread pool are busy, and for thread 9 it is needed to allocate another thread, so there supposed to be a delay.
After writing this sample app, I'm not sure about the scenario in my previous question.