рдкреБрд╕реНрддрдХ "рд╕реА # рдореЗрдВ рдкреНрд░рддрд┐рдпреЛрдЧрд┐рддрд╛ред рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ, рд╕рдорд╛рдирд╛рдВрддрд░ рдФрд░ рдорд▓реНрдЯреАрдереНрд░реЗрдбреЗрдб рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧред рджреВрд╕рд░рд╛ рдЗрдВрдЯред рдИрдбреАред "

рдЫрд╡рд┐рд╣реИрд▓реЛ, рд╣рдмреНрд░реЛрдЬрд╝рд┐рдЯреЗрд▓реА! рдпрджрд┐ рдЖрдк рдкреНрд░рддрд┐рд╕реНрдкрд░реНрдзреА рдФрд░ рдорд▓реНрдЯреАрдереНрд░реЗрдбреЗрдб рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рд╕реЗ рдбрд░рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдкреБрд╕реНрддрдХ рдЖрдкрдХреЗ рд▓рд┐рдП рд▓рд┐рдЦреА рдЧрдИ рд╣реИред рд╕реНрдЯреАрдлрди рдХреНрд▓реАрдпрд░ рдХреЗ рдкрд╛рд╕ рд╕рдорд╛рдирд╛рдВрддрд░ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдФрд░ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХреЗ рд▓рд┐рдП .NET рдФрд░ C # 8.0 рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП 85 рд░реЗрд╕рд┐рдкреА рд╣реИрдВред рдЕрддреНрдпрдзрд┐рдХ рд╕реНрдХреЗрд▓реЗрдмрд▓ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЛ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рддрд┐рд╕реНрдкрд░реНрдзрд╛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕реНрд╡реАрдХрд╛рд░ рдХреА рдЧрдИ рд╡рд┐рдзрд┐ рдмрди рдЧрдИ рд╣реИ, рд▓реЗрдХрд┐рди рд╕рдорд╡рд░реНрддреА рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдПрдХ рдХрдард┐рди рдХрд╛рдо рд╣реИред рдХреЛрдб рдкрд░ рд╡рд┐рд╕реНрддреГрдд рдЙрджрд╛рд╣рд░рдг рдФрд░ рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдВ рдпрд╣ рд╕рдордЭрдиреЗ рдореЗрдВ рдорджрдж рдХрд░реЗрдВрдЧреА рдХрд┐ рдЖрдзреБрдирд┐рдХ рдЙрдкрдХрд░рдг рдЕрдореВрд░реНрддрддрд╛ рдХреЗ рд╕реНрддрд░ рдХреЛ рдХреИрд╕реЗ рдмрдврд╝рд╛рддреЗ рд╣реИрдВ рдФрд░ рдкреНрд░рддрд┐рд╕реНрдкрд░реНрдзреА рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХреЛ рд╕рд░рд▓ рдмрдирд╛рддреЗ рд╣реИрдВред рдЖрдк рд╕реАрдЦреЗрдВрдЧреЗ рдХрд┐ рдХреИрд╕реЗ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ рдФрд░ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рд╕рдВрдЪрд╛рд▓рди рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░реЗрдВ, рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдереНрд░реЗрдбреНрд╕ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХреЛрдб рдХреА рдХреНрд╖рдорддрд╛рдУрдВ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░реЗрдВ, рдЯреАрдкреАрдПрд▓ рдбреЗрдЯрд╛рдлреНрд▓реЛ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рд╕рд╛рде рд╕рдорд╛рдирд╛рдВрддрд░ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХреА рдХреНрд╖рдорддрд╛ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдПрдВ,TPL рдбреЗрдЯрд╛рдлреНрд▓реЛ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рд╕рд╛рде рдбреЗрдЯрд╛ рдкреНрд░рд╡рд╛рд╣ рдкрд╛рдЗрдкрд▓рд╛рдЗрдиреЛрдВ рдХрд╛ рдирд┐рд░реНрдорд╛рдг, LINQ- рдЖрдзрд╛рд░рд┐рдд рд╕рд┐рд╕реНрдЯрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред рдирд┐рд╖реНрдХреНрд░рд┐рдп рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛, рдереНрд░реЗрдб-рд╕реБрд░рдХреНрд╖рд┐рдд рдФрд░ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рд╕рдВрдЧреНрд░рд╣ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ, рдкреНрд░рддрд┐рд╕реНрдкрд░реНрдзреА рдХреЛрдб рдХреА рдЗрдХрд╛рдИ рдкрд░реАрдХреНрд╖рдг рдХрд╛ рд╕рдВрдЪрд╛рд▓рди рдХрд░реЗрдВ, рдереНрд░реЗрдб рдкреВрд▓ рдХрд╛ рдирд┐рдпрдВрддреНрд░рдг рд▓реЗрдВ, рд╕рд╣реА рд╕рд╣рдХрд╛рд░реА рд░рджреНрджреАрдХрд░рдг рдХреЛ рд▓рд╛рдЧреВ рдХрд░реЗрдВ, рдкреНрд░рддрд┐рд╕реНрдкрд░реНрдзреА рддрд░реАрдХреЛрдВ рдХреЛ рд╕рдВрдпреЛрдЬрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░реЗрдВред , рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд░реВрдк рд╕реЗ рд╕рдВрдЧрдд рдСрдмреНрдЬреЗрдХреНрдЯ-рдУрд░рд┐рдПрдВрдЯреЗрдб рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХреА рд╕рднреА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ, рдХреЛрдб рдХреЗ рд▓рд┐рдП рдПрдбреЗрдкреНрдЯрд░ рдХреЛ рдкрд╣рдЪрд╛рдиреЗрдВ рдФрд░ рдмрдирд╛рдПрдВ рдЬреЛ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХреА рдкреБрд░рд╛рдиреА рд╢реИрд▓рд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИредрдкреНрд░рддрд┐рд╕реНрдкрд░реНрдзреА рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рд╕рдВрдпреЛрдЬрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░реЗрдВ, рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд░реВрдк рд╕реЗ рд╕рдВрдЧрдд рдСрдмреНрдЬреЗрдХреНрдЯ-рдУрд░рд┐рдПрдВрдЯреЗрдб рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХреА рд╕рднреА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ, рдХреЛрдб рдХреЗ рд▓рд┐рдП рдПрдбреЗрдкреНрдЯрд░ рдХреЛ рдкрд╣рдЪрд╛рдиреЗрдВ рдФрд░ рдмрдирд╛рдПрдВ рдЬреЛ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХреА рдкреБрд░рд╛рдиреА рд╢реИрд▓рд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИредрдкреНрд░рддрд┐рд╕реНрдкрд░реНрдзреА рддрд░реАрдХреЛрдВ рдХреЛ рд╕рдВрдпреЛрдЬрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░реЗрдВ, рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд░реВрдк рд╕реЗ рд╕рдВрдЧрдд рдСрдмреНрдЬреЗрдХреНрдЯ-рдУрд░рд┐рдПрдВрдЯреЗрдб рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХреА рд╕рднреА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ, рдХреЛрдб рдХреЗ рд▓рд┐рдП рдПрдбреЗрдкреНрдЯрд░ рдХреЛ рдкрд╣рдЪрд╛рдиреЗрдВ рдФрд░ рдмрдирд╛рдПрдВ рдЬреЛ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХреА рдкреБрд░рд╛рдиреА рд╢реИрд▓рд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред

рд╕рдорд╛рдирд╛рдВрддрд░ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХреА рдореВрд▓ рдмрд╛рддреЗрдВ


4.1ред рд╕рдорд╛рдирд╛рдВрддрд░ рдбрд╛рдЯрд╛ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ


рдХрд╛рд░реНрдп


рдбреЗрдЯрд╛ рдХрд╛ рдПрдХ рд╕рдВрдЧреНрд░рд╣ рд╣реИред рдЖрдкрдХреЛ рдкреНрд░рддреНрдпреЗрдХ рдбреЗрдЯрд╛ рдЖрдЗрдЯрдо рдХреЗ рд╕рд╛рде рдПрдХ рд╣реА рдСрдкрд░реЗрд╢рди рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдпрд╣ рдСрдкрд░реЗрд╢рди рдХрдореНрдкреНрдпреВрдЯреЗрд╢рдирд▓ рд░реВрдк рд╕реЗ рд╕реАрдорд┐рдд рд╣реИ рдФрд░ рдЗрд╕рдореЗрдВ рдХреБрдЫ рд╕рдордп рд▓рдЧ рд╕рдХрддрд╛ рд╣реИред

рдлреЗрд╕рд▓рд╛


рд╕рдорд╛рдирд╛рдВрддрд░ рдкреНрд░рдХрд╛рд░ рдореЗрдВ ForEach рдкрджреНрдзрддрд┐ рд╣реИ, рдЬрд┐рд╕реЗ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЗрд╕ рдХрд╛рд░реНрдп рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдирд┐рдореНрди рдЙрджрд╛рд╣рд░рдг рдХреЛ рдореИрдЯреНрд░рд┐рд╕ рдХрд╛ рд╕рдВрдЧреНрд░рд╣ рдорд┐рд▓рддрд╛ рд╣реИ рдФрд░ рдЗрди рдореИрдЯреНрд░рд┐рд╕ рдХреЛ рдШреБрдорд╛рддрд╛ рд╣реИ:

void RotateMatrices(IEnumerable<Matrix> matrices, float degrees)
{
   Parallel.ForEach(matrices, matrix => matrix.Rotate(degrees));
}

рдРрд╕реА рд╕реНрдерд┐рддрд┐рдпрд╛рдВ рд╣реЛ рд╕рдХрддреА рд╣реИрдВ рдЬрд┐рдирдореЗрдВ рд╕рдордп рд╕реЗ рдкрд╣рд▓реЗ рдЪрдХреНрд░ рдХреЛ рдирд┐рд░рд╕реНрдд рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдПрдХ рдЕрд╡реИрдз рдореВрд▓реНрдп рдХрд╛ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ)ред рдирд┐рдореНрди рдЙрджрд╛рд╣рд░рдг рдкреНрд░рддреНрдпреЗрдХ рдореИрдЯреНрд░рд┐рдХреНрд╕ рдХреЛ рдЙрд▓рдЯ рджреЗрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрджрд┐ рдПрдХ рдЕрд╡реИрдз рдореИрдЯреНрд░рд┐рдХреНрд╕ рдкрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд▓реВрдк рдмрд╛рдзрд┐рдд рд╣реЛ рдЬрд╛рдПрдЧрд╛:

void InvertMatrices(IEnumerable<Matrix> matrices)
{
   Parallel.ForEach(matrices, (matrix, state) =>
   {
      if (!matrix.IsInvertible)
        state.Stop();
      else
        matrix.Invert();
   });
}

рдпрд╣ рдХреЛрдб рд▓реВрдк рдХреЛ рд░реЛрдХрдиреЗ рдФрд░ рд▓реВрдк рдмреЙрдбреА рдХреЗ рдХрд┐рд╕реА рднреА рдЖрдЧреЗ рдХреЙрд▓ рдХреЛ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП ParallelLoopState.Stop рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдзреНрдпрд╛рди рд░рдЦреЗрдВ рдХрд┐ рдЪрдХреНрд░ рд╕рдорд╛рдирд╛рдВрддрд░ рд╣реИ, рдЗрд╕рд▓рд┐рдП, рдЪрдХреНрд░ рдХреЗ рд╢рд░реАрд░ рдХреЗ рдЕрдиреНрдп рдХреЙрд▓ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХрд┐рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдореЗрдВ рд╡рд░реНрддрдорд╛рди рдХреЗ рдмрд╛рдж рдХреЗ рддрддреНрд╡реЛрдВ рдХреЗ рд▓рд┐рдП рдХреЙрд▓ рднреА рд╢рд╛рдорд┐рд▓ рд╣реИред рджрд┐рдП рдЧрдП рдХреЛрдб рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдпрджрд┐ рддреАрд╕рд░рд╛ рдореИрдЯреНрд░рд┐рдХреНрд╕ рдкреНрд░рддрд┐рд╡рд░реНрддреА рдирд╣реАрдВ рд╣реИ, рддреЛ рдЪрдХреНрд░ рдмрд╛рдзрд┐рдд рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдирдП рдореЗрдЯреНрд░рд┐рд╕реЗрд╕ рдкрд░ рдХрд╛рд░реНрд░рд╡рд╛рдИ рдирд╣реАрдВ рдХреА рдЬрд╛рдПрдЧреА, рд▓реЗрдХрд┐рди рдпрд╣ рдкрддрд╛ рдЪрд▓ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЕрдиреНрдп рдореИрдЯреНрд░рд┐рдХреНрд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд┐рдП рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЪреМрдерд╛ рдФрд░ рдкрд╛рдВрдЪрд╡рд╛рдВ)ред

рдЕрдзрд┐рдХ рд╕рд╛рдорд╛рдиреНрдп рд╕реНрдерд┐рддрд┐ рддрдм рд╣реЛрддреА рд╣реИ рдЬрдм рдЖрдкрдХреЛ рд╕рдорд╛рдирд╛рдВрддрд░ рд▓реВрдк рдХреЛ рд░рджреНрдж рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдпрд╣ рдПрдХ рдЪрдХреНрд░ рдХреЛ рд░реЛрдХрдиреЗ рдХреЗ рд╕рдорд╛рди рдирд╣реАрдВ рд╣реИ; рдЪрдХреНрд░ рднреАрддрд░ рд╕реЗ рдмрдВрдж рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдмрд╛рд╣рд░ рд░рджреНрдж рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд░рджреНрдж рдХрд░реЗрдВ рдмрдЯрди рд░рджреНрджреАрдХрд░рдг рд░рджреНрдж рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдирд┐рдореНрди рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдорд╛рдирд╛рдВрддрд░ рд▓реВрдк рдХреЛ рд░рджреНрдж рдХрд░ рд░рд╣рд╛ рд╣реИ:

void RotateMatrices(IEnumerable<Matrix> matrices, float degrees,
      CancellationToken token)
{
   Parallel.ForEach(matrices,
         new ParallelOptions { CancellationToken = token },
         matrix => matrix.Rotate(degrees));
}

рдпрд╣ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рд╕рдорд╛рдирд╛рдВрддрд░ рдХрд╛рд░реНрдп рдПрдХ рдЕрд▓рдЧ рдзрд╛рдЧреЗ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП, рдХрд┐рд╕реА рднреА рд╕рдВрдпреБрдХреНрдд рд░рд╛рдЬреНрдп рдХреЛ рд╕рдВрд░рдХреНрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдирд┐рдореНрди рдЙрджрд╛рд╣рд░рдг рдкреНрд░рддреНрдпреЗрдХ рдореИрдЯреНрд░рд┐рдХреНрд╕ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЙрди рдореИрдЯреНрд░рд┐рдХреНрд╕ рдХреА рд╕рдВрдЦреНрдпрд╛ рдЧрд┐рдирддрд╛ рд╣реИ рдЬреЛ рдЙрд▓реНрдЯреЗ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреЗ:

// :     .
//      
//    .
int InvertMatrices(IEnumerable<Matrix> matrices)
{
  object mutex = new object();
  int nonInvertibleCount = 0;
  Parallel.ForEach(matrices, matrix =>
  {
     if (matrix.IsInvertible)
    {
       matrix.Invert();
    }
    else
    {
       lock (mutex)
      {
         ++nonInvertibleCount;
      }
    }
  });
  return nonInvertibleCount;
}

рд╡реНрдпрд╛рдЦреНрдпрд╛


Parallel.ForEach рд╡рд┐рдзрд┐ рдорд╛рдиреЛрдВ рдХреЗ рдЕрдиреБрдХреНрд░рдо рдХреЗ рд▓рд┐рдП рд╕рдорд╛рдирд╛рдВрддрд░ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдкреНрд░рджрд╛рди рдХрд░рддреА рд╣реИред рдПрдХ рд╕рдорд╛рди рд╕рдорд╛рдирд╛рдВрддрд░ LINQ (PLINQ) рд╕рдорд╛рдзрд╛рди LINQ- рдЬреИрд╕реЗ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдореЗрдВ рд▓рдЧрднрдЧ рд╕рдорд╛рди рдХреНрд╖рдорддрд╛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рд╕рдорд╛рдирд╛рдВрддрд░ рдФрд░ PLINQ рдХреЗ рдмреАрдЪ рдПрдХ рдЕрдВрддрд░ рдпрд╣ рд╣реИ рдХрд┐ PLINQ рдорд╛рдирддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХрдВрдкреНрдпреВрдЯрд░ рдкрд░ рд╕рднреА рдХреЛрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдЬрдмрдХрд┐ рд╕рдорд╛рдирд╛рдВрддрд░ рд╕рдорд╛рдирд╛рдВрддрд░ рд░реВрдк рд╕реЗ рдмрджрд▓рддреА рдкреНрд░реЛрд╕реЗрд╕рд░ рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдХрд╛ рдЬрд╡рд╛рдм рджреЗ рд╕рдХрддрд╛ рд╣реИред

Parallel.ForEach рдПрдХ рд╕рдорд╛рдирд╛рдВрддрд░ рдлрд╝реЙрд░реЗрд╕реНрдЯ рд▓реВрдк рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ рдЖрдкрдХреЛ рд▓реВрдк рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдорд╛рдирд╛рдВрддрд░ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рд╕рдорд╛рдирд╛рдВрддрд░ рд╡рд░реНрдЧ Parallel.For рд╡рд┐рдзрд┐ рдХрд╛ рднреА рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИред Parallel.For рд╡рд┐рдзрд┐ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧреА рд╣реИ рдЬрдм рдбреЗрдЯрд╛ рдХреЗ рдХрдИ рд╕рд░рдгрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдПрдХрд▓ рдЗрдВрдбреЗрдХреНрд╕ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВред

рдЕрддрд┐рд░рд┐рдХреНрдд рдЬрд╛рдирдХрд╛рд░реА


рдиреБрд╕реНрдЦрд╛ 4.2 рдорд╛рдиреЛрдВ рдХреА рдПрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЗ рд╕рдорд╛рдирд╛рдВрддрд░ рдПрдХрддреНрд░реАрдХрд░рдг рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдФрд╕рдд рдХрд╛ рдпреЛрдЧ рдФрд░ рдЧрдгрдирд╛ рд╢рд╛рдорд┐рд▓ рд╣реИред

рдкрдХрд╛рдиреЗ рдХреА рд╡рд┐рдзрд┐ 4.5 PLINQ рдХреА рдореВрд▓ рдмрд╛рддреЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред

рдЕрдзреНрдпрд╛рдп 10 рд░рджреНрдж рдХрд░рдиреЗ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИред

4.2ред рд╕рдорд╛рдирд╛рдВрддрд░ рдПрдХрддреНрд░реАрдХрд░рдг


рдХрд╛рд░реНрдп


рд╕рдорд╛рдирд╛рдВрддрд░ рдСрдкрд░реЗрд╢рди рдХреЗ рдЕрдВрдд рдореЗрдВ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЛ рдПрдХрддреНрд░ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ (рдПрдХрддреНрд░реАрдХрд░рдг рдХреЗ рдЙрджрд╛рд╣рд░рдг рдореВрд▓реНрдпреЛрдВ рдХрд╛ рдФрд╕рдд рдпрд╛ рдФрд╕рдд рдХреА рдЧрдгрдирд╛ рд╣реИ)ред

рдлреЗрд╕рд▓рд╛


рдПрдХрддреНрд░реАрдХрд░рдг рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╕рдорд╛рдирд╛рдВрддрд░ рд╡рд░реНрдЧ рд╕реНрдерд╛рдиреАрдп рдорд╛рдиреЛрдВ рдХреА рдЕрд╡рдзрд╛рд░рдгрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ - рдЪрд░ рдЬреЛ рдПрдХ рд╕рдорд╛рдирд╛рдВрддрд░ рд▓реВрдк рдХреЗ рднреАрддрд░ рд╕реНрдерд╛рдиреАрдп рд░реВрдк рд╕реЗ рдореМрдЬреВрдж рд╣реИрдВред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рд▓реВрдк рдмреЙрдбреА рдХреЗрд╡рд▓ рдореВрд▓реНрдп рдХреЛ рд╕реАрдзреЗ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ рдмрд┐рдирд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдЬрдм рд▓реВрдк рдЕрдкрдиреЗ рд╕рднреА рд╕реНрдерд╛рдиреАрдп рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЛ рдПрдХрддреНрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдпрд╣ рд╕реНрдерд╛рдиреАрдп рд░реВрдк рд╕реЗ рдкреНрд░рддрд┐рдирд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдРрд╕рд╛ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдзреНрдпрд╛рди рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рд╕реНрдерд╛рдиреАрдп рд░реВрдк рд╕реЗ рдкреНрд░рддрд┐рдирд┐рдзрд┐ рдХреЛ рдкрд░рд┐рдгрд╛рдо рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЪрд░ рддрдХ рдкрд╣реБрдВрдЪ рдХреЛ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рд╕рдорд╛рдирд╛рдВрддрд░ рдпреЛрдЧ рдХрд╛ рдЙрджрд╛рд╣рд░рдг:

// :     .
//      
//    .
int ParallelSum(IEnumerable<int> values)
{
  object mutex = new object();
  int result = 0;
  Parallel.ForEach(source: values,
        localInit: () => 0,
        body: (item, state, localValue) => localValue + item,
        localFinally: localValue =>
       {
          lock (mutex)
             result += localValue;
       });
  return result;
}

рд╕рдорд╛рдирд╛рдВрддрд░ LINQ рд╕рдорд╛рдирд╛рдВрддрд░ рд╡рд░реНрдЧ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рд╡реНрдпрд╛рдкрдХ рдПрдХрддреНрд░реАрдХрд░рдг рд╕рд╣рд╛рдпрддрд╛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ:

int ParallelSum(IEnumerable<int> values)
{
   return values.AsParallel().Sum();
}

рдареАрдХ рд╣реИ, рдпрд╣ рдПрдХ рд╕рд╕реНрддреА рдЪрд╛рд▓ рдереА рдХреНрдпреЛрдВрдХрд┐ PLINQ рдиреЗ рдХрдИ рдЖрдо рдСрдкрд░реЗрдЯрд░реЛрдВ (рдЬреИрд╕реЗ рд╕рдо) рдХреЗ рд▓рд┐рдП рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд╕рдорд░реНрдерди рдХрд┐рдпрд╛ рд╣реИред PLINQ рд╕рдХрд▓ рдСрдкрд░реЗрдЯрд░ рдХреЗ рд╕рд╛рде рд╕рд╛рдорд╛рдиреНрдп рдПрдХрддреНрд░реАрдХрд░рдг рд╕рд╣рд╛рдпрддрд╛ рднреА рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ:

int ParallelSum(IEnumerable<int> values)
{
  return values.AsParallel().Aggregate(
        seed: 0,
        func: (sum, item) => sum + item
  );
}

рд╡реНрдпрд╛рдЦреНрдпрд╛


рдпрджрд┐ рдЖрдк рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕рдорд╛рдирд╛рдВрддрд░ рд╡рд░реНрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдЗрд╕рдХреЗ рдПрдХрддреНрд░реАрдХрд░рдг рд╕рдорд░реНрдерди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЕрдиреНрдп рдорд╛рдорд▓реЛрдВ рдореЗрдВ, PLINQ рд╕рдорд░реНрдерди рдЖрдорддреМрд░ рдкрд░ рдЕрдзрд┐рдХ рдЕрднрд┐рд╡реНрдпрдВрдЬрдХ рд╣реИ, рдФрд░ рдХреЛрдб рдХрдо рд╣реИред

рдЕрддрд┐рд░рд┐рдХреНрдд рдЬрд╛рдирдХрд╛рд░реА


рдиреБрд╕реНрдЦрд╛ 4.5 PLINQ рдХреА рдореВрд▓ рдмрд╛рддреЗрдВ рдмрддрд╛рддрд╛ рд╣реИред

4.3ред рд╕рдорд╛рдирд╛рдВрддрд░ рдХреЙрд▓


рдХрд╛рд░реНрдп


рд╡рд┐рдзрд┐рдпреЛрдВ рдХрд╛ рдПрдХ рд╕реЗрдЯ рд╣реИ рдЬрд┐рд╕реЗ рд╕рдорд╛рдирд╛рдВрддрд░ рдореЗрдВ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдпреЗ рд╡рд┐рдзрд┐рдпрд╛рдБ (рдЕрдзрд┐рдХрддрд░) рдПрдХ рджреВрд╕рд░реЗ рд╕реЗ рд╕реНрд╡рддрдВрддреНрд░ рд╣реИрдВред

рдлреЗрд╕рд▓рд╛


рд╕рдорд╛рдирд╛рдВрддрд░ рд╡рд░реНрдЧ рдореЗрдВ рдРрд╕реЗ рдкрд░рд┐рджреГрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рдПрдХ рд╕рд░рд▓ рдЗрдирд╡реЛрдХ рд╡рд┐рдзрд┐ рд╣реИред рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рд╕рд░рдгреА рджреЛ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рд╣реИ, рдФрд░ рджреЛ рд╣рд┐рд╕реНрд╕реЛрдВ рдХреЛ рд╕реНрд╡рддрдВрддреНрд░ рд░реВрдк рд╕реЗ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:

void ProcessArray(double[] array)
{
   Parallel.Invoke(
         () => ProcessPartialArray(array, 0, array.Length / 2),
         () => ProcessPartialArray(array, array.Length / 2, array.Length)
   );
}

void ProcessPartialArray(double[] array, int begin, int end)
{
   // ,   ...
}

рдпрджрд┐ рдЖрдк рдирд┐рд╖реНрдкрд╛рджрди рд╕реЗ рдкрд╣рд▓реЗ рдХреЙрд▓ рдХреА рд╕рдВрдЦреНрдпрд╛ рдЕрдЬреНрдЮрд╛рдд рд╣реИ, рддреЛ рдЖрдк Parallel.Invoke рдкрджреНрдзрддрд┐ рдореЗрдВ рдкреНрд░рддрд┐рдирд┐рдзрд┐рдпреЛрдВ рдХрд╛ рдПрдХ рд╕рд░рдгреА рднреА рдкрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

void DoAction20Times(Action action)
{
   Action[] actions = Enumerable.Repeat(action, 20).ToArray();
   Parallel.Invoke(actions);
}

Parallel.Invoke рд╕рдорд╛рдирд╛рдВрддрд░ рд╡рд░реНрдЧ рдХреЗ рдЕрдиреНрдп рддрд░реАрдХреЛрдВ рдХреА рддрд░рд╣, рд░рджреНрдж рдХрд░рдиреЗ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ:

void DoAction20Times(Action action, CancellationToken token)
{
   Action[] actions = Enumerable.Repeat(action, 20).ToArray();
   Parallel.Invoke(new ParallelOptions { CancellationToken = token },
        actions);
}

рд╡реНрдпрд╛рдЦреНрдпрд╛


Parallel.Invoke рдкрджреНрдзрддрд┐ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рд╕рдорд╛рдирд╛рдВрддрд░ рдХреЙрд▓ рдХреЗ рд▓рд┐рдП рдПрдХ рд╢рд╛рдирджрд╛рд░ рд╕рдорд╛рдзрд╛рди рд╣реИред рдореИрдВ рдзреНрдпрд╛рди рджреЗрддрд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рдЙрди рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЗрддрдирд╛ рдЙрдкрдпреБрдХреНрдд рдирд╣реАрдВ рд╣реИ рдЬрд┐рдирдореЗрдВ рдЖрдк рдкреНрд░рддреНрдпреЗрдХ рдЗрдирдкреБрдЯ рдбреЗрдЯрд╛ рддрддреНрд╡ рдХреЗ рд▓рд┐рдП рдПрдХ рдХреНрд░рд┐рдпрд╛ рдХреЛ рд╕рдХреНрд░рд┐рдп рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ (рдЗрд╕рдХреЗ рд▓рд┐рдП Parallel.ForEach рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реИ), рдпрд╛ рдпрджрд┐ рдкреНрд░рддреНрдпреЗрдХ рдХреНрд░рд┐рдпрд╛ рдХреБрдЫ рдЖрдЙрдЯрдкреБрдЯ рдХрд╛ рдЙрддреНрдкрд╛рджрди рдХрд░рддреА рд╣реИ (рдЗрд╕рдХреЗ рдмрдЬрд╛рдп Parallel LINQ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП)ред

рдЕрддрд┐рд░рд┐рдХреНрдд рдЬрд╛рдирдХрд╛рд░реА


рдкрдХрд╛рдиреЗ рдХреА рд╡рд┐рдзрд┐ 4.1 Parallel.ForEach рд╡рд┐рдзрд┐ рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдкреНрд░рддреНрдпреЗрдХ рдбреЗрдЯрд╛ рдЖрдЗрдЯрдо рдХреЗ рд▓рд┐рдП рдПрдХ рдХреНрд░рд┐рдпрд╛ рдХрд░рддрд╛ рд╣реИред

рд░реЗрд╕рд┐рдкреА рд╕рдорд╛рдирд╛рдВрддрд░ LINQ рдХреЗ рд╕рд╛рде 4.5 рд╕реМрджреЛрдВред

рд▓реЗрдЦрдХ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ


рдПрдХ рдЕрдиреБрднрд╡реА рдбреЗрд╡рд▓рдкрд░ рд╕реНрдЯреАрдлрди рдХреНрд▓реА , рдПрдЖрд░рдПрдо рд╕реЗ рдЕрдЬрд╝реБрд░реЗ рдЧрдП рд╣реИрдВред рдЙрдиреНрд╣реЛрдВрдиреЗ рдУрдкрди рд╕реЛрд░реНрд╕ рдмреВрд╕реНрдЯ рд╕реА ++ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдореЗрдВ рдпреЛрдЧрджрд╛рди рджрд┐рдпрд╛ рдФрд░ рдХрдИ рдорд╛рд▓рд┐рдХрд╛рдирд╛ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдФрд░ рдЙрдкрдпреЛрдЧрд┐рддрд╛рдУрдВ рдХреЛ рдЬрд╛рд░реА рдХрд┐рдпрд╛ред

┬╗рдХрд┐рддрд╛рдм рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдкрд░ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рдкреНрд░рдХрд╛рд╢рдХ рдХреА рд╡реЗрдмрд╕рд╛рдЗрдЯ
┬╗ рд╕рд╛рдордЧреНрд░реА
┬╗ рдЕрдВрд╢

рдХреВрдкрди рдкрд░ рд▓рд┐рдП Khabrozhiteley 25% рдЫреВрдЯ - Cleary

рдкреБрд╕реНрддрдХ рдХреЗ рдХрд╛рдЧрдЬ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рднреБрдЧрддрд╛рди рдХрд░рдиреЗ рдкрд░, рдПрдХ рдЗрд▓реЗрдХреНрдЯреНрд░реЙрдирд┐рдХ рдкреБрд╕реНрддрдХ рдИ-рдореЗрд▓ рджреНрд╡рд╛рд░рд╛ рднреЗрдЬрд╛ рдЬрд╛рддрд╛ рд╣реИред

All Articles