В приведенном ниже примере _DisplayUsingThreads (timesToDisplay) действительно работают параллельно. В то время как другие два _DisplayUsingTasks и _DisplayUsingDelegates выполняют только 4 за раз (на четырехъядерном процессоре), а затем ждут секунды, прежде чем делать еще 4. Зачем?Задачи/Thread/Delegate.beginInvoke с Thread.Sleep()
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
delegate void DisplayDelegate();
DisplayDelegate myDisplaySleep;
private void btnGo_Click(object sender, EventArgs e)
{
const int timesToDisplay = 50;
//_DisplayUsingDelegates(timesToDisplay);
//_DisplayUsingTasks(timesToDisplay);
//_DisplayUsingThreads(timesToDisplay);
}
private void _DisplayUsingTasks(int displayNumber)
{
for (int i = 0; i < displayNumber; i++)
{
Task task = new Task(DisplayIdSleep);
task.Start();
}
}
private void _DisplayUsingThreads(int displayNumber)
{
for (int i = 0; i < displayNumber; i++)
{
Thread thread = new Thread(DisplayIdSleep);
thread.Start();
}
}
private void _DisplayUsingDelegates(int displayNumber)
{
myDisplaySleep = DisplayIdSleep;
for (int i = 0; i < displayNumber; i++)
{
myDisplaySleep.BeginInvoke(null, null);
}
}
private void DisplayIdSleep()
{
Debug.WriteLine("Thread Id : {0}", Thread.CurrentThread.ManagedThreadId);
Thread.Sleep(1000);
}
}
Как говорит Джейсон, основной пул потоков Windows преднамеренно ограничивает скорость, с которой могут создаваться новые потоки. Он делает это для смягчения плохих последствий одновременного запуска многих новых потоков. –