Взято из ответа на один из моих предыдущих вопросов ( Task.Factory.StartNew начинается с большой задержкой, несмотря на наличие доступных потоков в пуле потоков ):
"Это не такзначение рабочих потоков MAX, на которое нужно обратить внимание - это значение MIN, которое вы получаете через ThreadPool.GetMinThreads (). Максимальное значение - это абсолютный максимальный поток, который может быть активным. Минимальное значение - это число, которое всегда остается активным.попробуйте запустить поток, когда число активных потоков меньше максимального (и больше минимального), вы увидите задержку в 2 секунды. "
Итак, я подготовил пример кода дляпроверьте это:
ThreadPool.GetMinThreads()
возвращает "8" для моей машины, и я запускаю код на своей локальной машине.
Мой код выглядит следующим образом:
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;
}
}
Класс Logger просто использует log4net.dll.Итак, ThreadPool.GetMinThreads () возвращает 8 для моей машины. Минимальное значение - это число, которое всегда остается активным.Если вы попытаетесь запустить поток, когда число активных потоков меньше максимального (и больше минимального), вы увидите задержку в 2 секунды.
Итак, для потока номер 9 и т. Д.:
Logger.WriteInfo(LogCode.EMPTY_INFO, "before thread9");
task = Task.Factory.StartNew(() =>
{
Logger.WriteInfo(LogCode.EMPTY_INFO, "after thread9");
while (true)
{
DoSomthing();
}
});
Я ожидаю, что будет задержка в 2 секунды между
Logger.WriteInfo(LogCode.EMPTY_INFO, "before thread9");
и
Logger.WriteInfo(LogCode.EMPTY_INFO, "after thread9");
, потому что я пытаюсь запустить поток (из потокапул), когда количество активных потоков больше, чем мин (больше, чем 8).Фактический результат заключается в том, что для всего потока 9–13 существует задержка в несколько маленьких миллисекунд (менее полсекунды).
Почему задержка не равна 2 секундам?Я имею в виду, что все активные потоки в моем пуле потоков заняты, и для потока 9 необходимо выделить другой поток, поэтому должна быть задержка.
После написания этого примера приложения я неуверен в сценарии в моем предыдущем вопросе.