В вашем примере методы будут определенно последовательными, потому что консоль .NET будет synchronize calls from different threads.
Вы можете, однако, проверить идентификатор потока, на котором выполняется метод с использованием Thread.ManagedThreadID или Environment.CurrentManagedThreadId (для .NET 4,5)
class Program
{
static void Main(string[] args)
{
// first run with default number of threads
Parallel.For(0, 10, i => DoSomething(i));
Console.ReadLine();
// now run with fewer threads...
Parallel.For(0, 10, new ParallelOptions{
MaxDegreeOfParallelism = 2
}, i => DoSomething(i));
Console.ReadLine();
}
static void DoSomething(int par)
{
int i = Environment.CurrentManagedThreadId;
// int i = Thread.ManagedThreadId; -- .NET 4.0 and under
Thread.Sleep(200);
Console.WriteLine("Test: "+ par.ToString() +
", Thread :" + i.ToString());
}
}
Если вы запустите это без Thread.Sleep
вы заметите, что только несколько потоков будет использоваться, поскольку вызов будет завершен достаточно быстро, чтобы поток был возвращен в пул вовремя, чтобы получить следующее задание, которое распределяется по очереди.
Добавление сна будет задерживать поток (имитирующий работу) достаточно долго, чтобы в потоковом потоке было больше источников потоков, чтобы своевременно выработать задание.
При параллельном выполнении любой задачи легко проверить, что задачи, по сути, выполняются в отдельных потоках. Однако, независимо от того, получаете ли вы выгоду от производительности, это будет зависеть от того, насколько эффективно эти потоки могут работать. Как вы видели, некоторые операции вызывают конкуренцию на общем ресурсе (например, запись на консоль) и могут препятствовать одновременной работе многих потоков.
Другими источниками разногласий могут быть, например, выделение памяти - если ваши потоки распределяют и выделяют память, то они могут потратить много времени на ожидание своей очереди с менеджером памяти. Это ограничит реальную степень параллелизма, которую вы достигнете.
Сделать одну из задач более длинной, например 'if (par == 1) Thread.Sleep (1000); Console.Write .... ' –
Вы можете попытаться преднамеренно создать условие гонки и посмотреть, если это произойдет. –
Почему вы не пытаетесь напечатать 'Текущее время'? – Adheep