что методы будут действительно выполняться параллельно, тем не менее, именно такое их выполнение предполагается, если система поддерживает несколько процессоров. Кроме того, отсутствует возможность указать порядок выполнения методов от первого и до последнего, и этот порядок не может быть таким же, как и в списке аргументов.
В приведенном ниже примере программы демонстрируется применение метода Invoke () на практике. В этой программе два метода MyMeth () и MyMeth2 () выполняются параллельно посредством вызова метода Invoke (). Обратите внимание на простоту организации данного процесса.
// Применить метод Parallel.Invoke() для параллельного выполнения двух методов.
using System;
using System.Threading;
using System.threading.Tasks;
class DemoParallel {
// Метод, исполняемый как задача, static void MyMeth() {
Console.WriteLine('MyMeth запущен');
for (int count = 0; count < 5; count++) {
Thread.Sleep(500);
Console.WriteLine('В методе MyMeth подсчет равен ' + count );
}
Console.WriteLine('MyMeth завершен');
}
// Метод, исполняемый как задача, static void MyMeth2() {
Console.WriteLine('MyMeth2 запущен');
for(int count = 0; count < 5; count++) {
Thread.Sleep(500);
Console.WriteLine('В методе MyMeth2, подсчет равен ' + count );
}
Console.WriteLine('MyMeth2 завершен');
}
static void Main() {
Console.WriteLine('Основной поток запущен.');
// Выполнить параллельно два именованных метода.
Parallel.Invoke(MyMeth, MyMeth2);
Console.WriteLine('Основной поток завершен.');
}
}
Выполнение этой программы может привести к следующему результату.
Основной поток запущен.
MyMeth() запущен MyMeth2() запущен В методе MyMeth() подсчет равен 0 В методе MyMeth2() подсчет равен 0 В методе MyMeth() подсчет равен 1 В методе MyMeth2() подсчет равен 1 В методе MyMeth() подсчет равен 2 В методе MyMeth2() подсчет равен 2 В методе MyMeth() подсчет равен 3
В методе MyMeth2() подсчет равен 3 В методе MyMethO подсчет равен 4 MyMeth() завершен
В методе MyMeth2() подсчет равен 4 MyMeth2() завершен Основной поток завершен.
В данном примере особое внимание обращает на себя следующее обстоятельство: выполнение метода Main () приостанавливается до тех пор, пока не произойдет возврат из метода Invoke (). Следовательно, метод Main (), в отличие от методов MyMeth () и MyMeth2 (), не выполняется параллельно. Поэтому применять метод Invoke () показанным здесь способом нельзя в том случае, если требуется, чтобы исполнение вызывающего потока продолжалось.
В приведенном выше примере использовались именованные методы, но для вызова метода Invoke () это условие не является обязательным. Ниже приведен переделанный вариант той же самой программы, где в качестве аргументов в вызове метода Invoke () применяются лямбда-выражения.
// Применить метод Parallel.Invoke() для параллельного выполнения двух методов. // В этой версии программы применяются лямбда-выражения.
using System;
using System.Threading;
