В данном примере особое внимание обращает на себя следующее обстоятельство: выполнение метода 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