В данном примере особое внимание обращает на себя следующее обстоятельство: выполнение метода Main приостанавливается до тех пор, пока не произойдет возврат из метода Invoke . Следовательно, метод Main , в отличие от методов MyMeth и MyMeth2 , не выполняется параллельно. Поэтому применять метод Invoke показанным здесь способом нельзя в том случае, если требуется, чтобы исполнение вызывающего потока продолжалось.
В приведенном выше примере использовались именованные методы, но для вызова методаInvoke это условие не является обязательным. Ниже приведен переделанный вариант той же самой программы, где в качестве аргументов в вызове методаInvoke применяются лямбда-выражения.
// Применить метод Parallel.Invoke для параллельного выполнения двух методов. // В этой версии программы применяются лямбда-выражения.
using System;
using System.Threading;
using System.Threading.Tasks;
class DemoParallel {
static void Main {
Console.WriteLine("Основной поток запущен.");
// Выполнить два анонимных метода, указываемых в лямбда-выражениях.
Parallel.Invoke( => {
Console.WriteLine("Выражение #1 запущено");
for(int count = 0; count < 5; count++) {
Thread.Sleep(500);
Console.WriteLine("В выражении #1 подсчет равен " + count );
}
Console.WriteLine("Выражение #1 завершено");
},
О => {
Console.WriteLine("Выражение #2 запущено");
for (int count = 0; count < 5; count++) {
Thread.Sleep(500);
Console.WriteLine("В выражении #2 подсчет равен " + count );
}
Console.WriteLine("Основной поток завершен.");
}
}
Эта программа дает результат, похожий на результат выполнения предыдущей программы.
Применение метода For
В TPL параллелизм данных поддерживается, в частности, с помощью методаFor ,определенного в классеParallel.Этот метод существует в нескольких формах. Его рассмотрение мы начнем с самой простой формы, приведенной ниже:
public static ParallelLoopResult
For(int
где
public delegate void Action