рдирд┐рд░реНрднрд░рддрд╛ рд╡рд╛рд▓реЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╕рдорд╛рдирд╛рдВрддрд░ рдХрд░рдирд╛ - .NET рдЙрджрд╛рд╣рд░рдг

рдирдорд╕реНрдХрд╛рд░ рд╕рд╛рдерд┐рдпреЛрдВ!

рдЗрд╕ рд╣рдлреНрддреЗ, рд╣рдордиреЗ .NET рдореЗрдВ рдореИрдирд┐рдВрдЧ рдХреА рдкреБрд╕реНрддрдХ рдХрдВрдЬреЗрдВрд╕реА рдХреЛ рджрд╛рди рдХрд░ рджрд┐рдпрд╛ , рдЬреЛ рдЬрдЯрд┐рд▓рддрд╛ рдХреА рдПрдХ рдорд╣рддреНрд╡рд╛рдХрд╛рдВрдХреНрд╖реА рдкреБрд╕реНрддрдХ рд╣реИ:



рд▓реЗрдЦрдХ рдиреЗ рдХреГрдкрдпрд╛ рдорд╛рдзреНрдпрдо рд╡реЗрдмрд╕рд╛рдЗрдЯ рдкрд░ 13 рд╡реЗрдВ рдЕрдзреНрдпрд╛рдп рдХрд╛ рдПрдХ рдЕрдВрд╢ рдкреЛрд╕реНрдЯ рдХрд┐рдпрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рд╣рдо рдкреНрд░реАрдорд┐рдпрд░ рд╕реЗ рдмрд╣реБрдд рдкрд╣рд▓реЗ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рджреЗрддреЗ рд╣реИрдВред
рдЕрдЪреНрдЫрд╛ рдкрдврд╝ рд▓реЛ!

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

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

рд╕рдорд╛рдзрд╛рди: рд╣рдо F # рд╕реЗ MailboxProcessor рд╡рд░реНрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдирд┐рд░реНрднрд░рддрд╛ рдЧреНрд░рд╛рдл рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдорд╛рдирдХ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рддрд░реАрдХреЗ рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рд╡реЗ C # рд╕реЗ рднрд╕реНрдо рд╣реЛ рд╕рдХреЗрдВ

рдЗрд╕ рд╕рдорд╛рдзрд╛рди рдХреЛ рдУрд░рд┐рдПрдВрдЯреЗрдб рдПрд╕рд╛рдЗрдХреНрд▓рд┐рдХ рдЧреНрд░рд╛рдл (рдбреАрдПрдЬреА) рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдирд┐рд░реНрднрд░рддрд╛рдУрдВ рдХреЗ рд╕рд╛рде рдкрд░рдорд╛рдгреБ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЗ рдЕрдиреБрдХреНрд░рдореЛрдВ рдореЗрдВ рд╕рдВрдЪрд╛рд▓рди рдХреЛ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рдХреЗ рдПрдХ рдЧреНрд░рд╛рдл рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЧреНрд░рд╛рдл рдХрд╛ рдПрд╕рд╛рдЗрдХреНрд▓рд┐рдХ рд╕рд╛рд░ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдмреАрдЪ рдЧрддрд┐рд░реЛрдз рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ, рдмрд╢рд░реНрддреЗ рдХрд┐ рдХрд╛рд░реНрдп рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдкрд░рдорд╛рдгреБ рд╣реИрдВред рдЧреНрд░рд╛рдл рд╕реЗрдЯ рдХрд░рддреЗ рд╕рдордп, рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдмреАрдЪ рд╕рднреА рдирд┐рд░реНрднрд░рддрд╛рдУрдВ рдХреЛ рд╕рдордЭрдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдирд┐рд░реНрднрд░рддрд╛рдПрдВ рдЬреЛ рдЧрддрд┐рд░реЛрдз рдпрд╛ рджреМрдбрд╝ рдХреА рд╕реНрдерд┐рддрд┐ рдкреИрджрд╛ рдХрд░ рд╕рдХрддреА рд╣реИрдВред рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдПрдХ рдЧреНрд░рд╛рдл-рдЬреИрд╕реА рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛ рдХрд╛ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЙрджрд╛рд╣рд░рдг рд╣реИ, рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рдЖрдк рдХрд┐рд╕реА рд╕реАрдорд╛ рдкрд░ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рдмреАрдЪ рдмрд╛рддрдЪреАрдд рдХреА рдпреЛрдЬрдирд╛ рдмрдирд╛рддреЗ рд╕рдордп рдЙрддреНрдкрдиреНрди рд╣реЛрдиреЗ рд╡рд╛рд▓реА рд╕реАрдорд╛рдУрдВ рдХреА рдХрд▓реНрдкрдирд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдЧреНрд░рд╛рдлрд╝ рдПрдХ рдЕрддреНрдпрдВрдд рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛ рд╣реИ, рдФрд░ рдХреЛрдИ рднреА рдЗрд╕рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рдПрд▓реНрдЧреЛрд░рд┐рджрдо рд▓рд┐рдЦ рд╕рдХрддрд╛ рд╣реИред



рдЕрдВрдЬреАрд░ред 1 рдПрдХ рдЧреНрд░рд╛рдл рдХрд┐рдирд╛рд░реЛрдВ рджреНрд╡рд╛рд░рд╛ рдЬреБрдбрд╝реЗ рдХреЛрдиреЗ рдХрд╛ рдПрдХ рд╕рдВрдЧреНрд░рд╣ рд╣реИред рдирд┐рд░реНрджреЗрд╢рд┐рдд рдЧреНрд░рд╛рдл рдХреЗ рдЗрд╕ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдореЗрдВ, рдиреЛрдб 1 рдиреЛрдб 4 рдФрд░ 5 рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ, рдиреЛрдб 2 рдиреЛрдб 5 рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ, рдиреЛрдб 3 рдиреЛрдб 5 рдФрд░ 6 рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ, рдЖрджрд┐ред

DAG рд╕рдВрд░рдЪрдирд╛ рдирд┐рд░реНрднрд░рддрд╛ рдХреЗ рдХреНрд░рдо рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддреЗ рд╣реБрдП рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд╕рдорд╛рдирд╛рдВрддрд░ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рд▓рд┐рдП рдПрдХ рд░рдгрдиреАрддрд┐ рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд╛рдЧреВ рд╣реЛрддреА рд╣реИ, рдЬреЛ рдЙрддреНрдкрд╛рджрдХрддрд╛ рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд░рддреА рд╣реИред рдРрд╕реЗ рдЧреНрд░рд╛рдл рдХреА рд╕рдВрд░рдЪрдирд╛ F # рд╕реЗ MailboxProcessor рд╡рд░реНрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИ; рдЗрд╕ рд╡рд░реНрдЧ рдореЗрдВ, рдХрд┐рдирд╛рд░реЛрдВ рдХреА рдирд┐рд░реНрднрд░рддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рд▓рд┐рдП рдкрдВрдЬреАрдХреГрдд рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЖрдВрддрд░рд┐рдХ рд╕реНрдерд┐рддрд┐ рд╕рдВрд░рдХреНрд╖рд┐рдд рд╣реИред

рдУрд░рд┐рдПрдВрдЯреЗрдб рдПрд╕рд╛рдЗрдХреНрд▓рд┐рдХ рдЧреНрд░рд╛рдл рд╡реИрд▓рд┐рдбреЗрд╢рди

рдХрд┐рд╕реА рднреА рдЧреНрд░рд╛рдл рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛ рдЬреИрд╕реЗ рдбреАрдПрдЬреА рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╕рдордп, рдЖрдкрдХреЛ рдХрд┐рдирд╛рд░реЛрдВ рдХреЗ рд╕рд╣реА рдкрдВрдЬреАрдХрд░рдг рдХрд╛ рдзреНрдпрд╛рди рд░рдЦрдирд╛ рд╣реЛрдЧрд╛ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЪрд┐рддреНрд░ 1 рдкрд░ рд▓реМрдЯрдирд╛: рдпрджрд┐ рдиреЛрдб 5 рдкрд░ рдирд┐рд░реНрднрд░рддрд╛ рдХреЗ рд╕рд╛рде рд╣рдордиреЗ рдиреЛрдб 2 рдкрдВрдЬреАрдХреГрдд рдХрд┐рдпрд╛ рд╣реИ рддреЛ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдиреЛрдб 5 рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реИ? рдРрд╕рд╛ рднреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдХреБрдЫ рдХрд┐рдирд╛рд░реЗ рдПрдХ-рджреВрд╕рд░реЗ рдкрд░ рдирд┐рд░реНрднрд░ рд╣реЛрддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдПрдХ рдЙрдиреНрдореБрдЦ рдЪрдХреНрд░ рд╣реЛрддрд╛ рд╣реИред рдПрдХ рдЙрдиреНрдореБрдЦ рдЪрдХреНрд░ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдореЗрдВ, рд╕рдорд╛рдирд╛рдВрддрд░ рдореЗрдВ рдХреБрдЫ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдХрд░рдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ; рдЕрдиреНрдпрдерд╛, рдХреБрдЫ рдХрд╛рд░реНрдп рд╣рдореЗрд╢рд╛ рджреВрд╕рд░реЛрдВ рдХреЗ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдПрдХ рдЧрддрд┐рд░реЛрдз рдЙрддреНрдкрдиреНрди рд╣реЛрдЧрд╛ред

рд╕рдорд╕реНрдпрд╛ рдХреЛ рдЯреЛрдкреЛрд▓реЙрдЬрд┐рдХрд▓ рд╕реЙрд░реНрдЯрд┐рдВрдЧ рджреНрд╡рд╛рд░рд╛ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ: рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рд╣рдо рдЧреНрд░рд╛рдл рдХреЗ рд╕рднреА рд╢реАрд░реНрд╖реЛрдВ рдХреЛ рдЖрджреЗрд╢ рджреЗ рд╕рдХрддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рдХреЛрдИ рднреА рдзрд╛рд░ рдХрдо рд╕рдВрдЦреНрдпрд╛ рд╕реЗ рдЙрдЪреНрдЪ рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд╕рд╛рде рд╢реАрд░реНрд╖ рд╕реЗ рд╢рд┐рдЦрд░ рдХреА рдУрд░ рдЬрд╛рдПред рдЗрд╕рд▓рд┐рдП, рдпрджрд┐ рдХрд╛рд░реНрдп A рдХреЛ рдХрд╛рд░реНрдп B рд╕реЗ рдкрд╣рд▓реЗ рд╕рдорд╛рдкреНрдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рдХрд╛рд░реНрдп B рд╕реЗ рдкрд╣рд▓реЗ, рдХрд╛рд░реНрдп C, рдЬреЛ, рдмрджрд▓реЗ рдореЗрдВ, рдХрд╛рд░реНрдп A рд╕реЗ рдкрд╣рд▓реЗ рдкреВрд░рд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдПрдХ рдкрд░рд┐рдкрддреНрд░ рд▓рд┐рдВрдХ рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рд╣реИ, рдФрд░ рд╕рд┐рд╕реНрдЯрдо рдЖрдкрдХреЛ рдЗрд╕ рддреНрд░реБрдЯрд┐ рдХреА рд╕реВрдЪрдирд╛ рджреЗрдЧрд╛, рдЕрдкрд╡рд╛рдж рдХреЛ рдлреЗрдВрдХрддреЗ рд╣реБрдПред рдпрджрд┐ рдХреНрд░рдо рдкреНрд░рдмрдВрдзрди рдореЗрдВ рдПрдХ рдЙрдиреНрдореБрдЦ рдЪрдХреНрд░ рдЙрддреНрдкрдиреНрди рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдХреЛрдИ рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВ рд╣реИред рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рдЪреЗрдХ рдХреЛ "рдирд┐рд░реНрджреЗрд╢рд┐рдд рдЧреНрд░рд╛рдл рдореЗрдВ рдПрдХ рдЪрдХреНрд░ рдвреВрдВрдврдирд╛" рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрджрд┐ рдПрдХ рдирд┐рд░реНрджреЗрд╢рд┐рдд рдЧреНрд░рд╛рдл рд╡рд░реНрдгрд┐рдд рдирд┐рдпрдореЛрдВ рдХреЛ рд╕рдВрддреБрд╖реНрдЯ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдПрдХ рдирд┐рд░реНрджреЗрд╢рд┐рдд рдЪрдХреНрд░реАрдп рдЧреНрд░рд╛рдл рд╣реИ рдЬреЛ рд╕рдорд╛рдирд╛рдВрддрд░ рдореЗрдВ рдХрдИ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкреВрд░реА рддрд░рд╣ рдЙрдкрдпреБрдХреНрдд рд╣реИ, рдЬрд┐рд╕рдХреЗ рдмреАрдЪ рдирд┐рд░реНрднрд░рддрд╛рдПрдВ рд╣реИрдВред

рд╕реВрдЪреА 2 рдХрд╛ рдкреВрд░реНрдг рд╕рдВрд╕реНрдХрд░рдг, DAG рд╕рддреНрдпрд╛рдкрди рдХреЛрдб рд╕реЗ рдпреБрдХреНрдд рд╣реИ, рдЬреЛ рдСрдирд▓рд╛рдЗрди рд╕реНрд░реЛрдд рдХреЛрдб рдореЗрдВ рд╣реИред

рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕реВрдЪреА рдореЗрдВ, F # MailboxProccessor рд╡рд░реНрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдПрдХ DAG рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЖрджрд░реНрд╢ рдЙрдореНрдореАрджрд╡рд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬреЛ рдирд┐рд░реНрднрд░рддрд╛ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╕рдорд╛рдирд╛рдВрддрд░ рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдкрд╣рд▓реЗ, рдЪрд▓реЛ рдПрдХ рд▓реЗрдмрд▓ рдпреВрдирд┐рдпрди рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рд╣рдо рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдкреНрд░рдмрдВрдзрди рдХрд░реЗрдВрдЧреЗ рдФрд░ рдЙрдирдХреА рдирд┐рд░реНрднрд░рддрд╛ рдХреЛ рдкреВрд░рд╛ рдХрд░реЗрдВрдЧреЗред

рдЙрдирдХреА рдирд┐рд░реНрднрд░рддрд╛ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд╕рдордиреНрд╡рдп рдХреЗ рд▓рд┐рдП 1 рд╕рдВрджреЗрд╢ рдкреНрд░рдХрд╛рд░ рдФрд░ рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛ рд╕реВрдЪреАрдмрджреНрдз рдХрд░рдирд╛

 type TaskMessage = // #A | AddTask of int * TaskInfo | QueueTask of TaskInfo | ExecuteTasks and TaskInfo = // #B { Context : System.Threading.ExecutionContext Edges : int array; Id : int; Task : Func<Task> EdgesLeft : int option; Start : DateTimeOffset option End : DateTimeOffset option } 


#A рдЖрдзрд╛рд░ dagAgent рдХреЛ ParallelTasksDAG рднреЗрдЬрддрд╛ рд╣реИ, рдЬреЛ рд╕рдордиреНрд╡рдп рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИ

# рдмреА рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рддреНрдпреЗрдХ рдХрд╛рд░реНрдп рдХрд╛ рд╡рд┐рд╡рд░рдг рд▓рдкреЗрдЯрддрд╛ рд╣реИ

TaskMessage рдкреНрд░рдХрд╛рд░ TaskMessage рдкреНрд░рдХрд╛рд░ рдХреЗ рдмреЗрд╕ рдПрдЬреЗрдВрдЯ рдХреЛ рднреЗрдЬреЗ рдЧрдП рд╕рдВрджреЗрд╢ рдЖрд╡рд░рдгреЛрдВ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддрд╛ рд╣реИред рдЗрди рд╕рдВрджреЗрд╢реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд╕рдордиреНрд╡рдп рдФрд░ рдирд┐рд░реНрднрд░рддрд╛ рдХреЛ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред TaskInfo рдкреНрд░рдХрд╛рд░ рдореЗрдВ DAG рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рджреМрд░рд╛рди рдкрдВрдЬреАрдХреГрдд рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рд╡рд┐рд╡рд░рдг рд╣реЛрддрд╛ рд╣реИ рдФрд░ рдирд┐рд░реНрднрд░рддрд╛ рдХрд┐рдирд╛рд░реЛрдВ рд╕рд╣рд┐рдд рдЯреНрд░реИрдХ рдХрд░рддрд╛ рд╣реИред рдирд┐рд╖реНрдкрд╛рджрди рдХрд╛ рд╕рдВрджрд░реНрдн (https://msdn.microsoft.com/en-us/library/system.threading.executioncontext(v=vs.110).aspx) рд╡рд┐рд▓рдВрдмрд┐рдд рдирд┐рд╖реНрдкрд╛рджрди рдореЗрдВ рд╕реВрдЪрдирд╛ рддрдХ рдкрд╣реБрдБрдЪрдиреЗ рдХреЗ рдЙрджреНрджреЗрд╢реНрдп рд╕реЗ рдкрдХрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдРрд╕реА рдЬрд╛рдирдХрд╛рд░реА: рд╡рд░реНрддрдорд╛рди рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛, рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рддрд╛рд░реНрдХрд┐рдХ рдзрд╛рдЧреЗ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдХреЛрдИ рднреА рд░рд╛рдЬреНрдп, рдХреЛрдб рддрдХ рд╕реБрд░рдХреНрд╖рд┐рдд рдкрд╣реБрдВрдЪ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдЖрджрд┐ред рдШрдЯрдирд╛ рд╢реБрд░реВ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, рдкреНрд░рд╛рд░рдВрдн рдФрд░ рд╕рдорд╛рдкреНрддрд┐ рд╕рдордп рдкреНрд░рдХрд╛рд╢рд┐рдд рд╣реЛрддреЗ рд╣реИрдВред

рдирд┐рд░реНрднрд░рддрд╛ рд╕рдВрдмрдВрдзрд┐рдд рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╕рдорд╛рдирд╛рдВрддрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдл # рдкрд░ 2 рдбреАрдПрдЬреА рдПрдЬреЗрдВрдЯ рдХреА рд╕реВрдЪреА рдмрдирд╛рдирд╛

 type ParallelTasksDAG() = let onTaskCompleted = new Event<TaskInfo>() // #A let dagAgent = new MailboxProcessor<TaskMessage>(fun inbox -> let rec loop (tasks : Dictionary<int, TaskInfo>) // #B (edges : Dictionary<int, int list>) = async { // #B let! msg = inbox.Receive() // #C match msg with | ExecuteTasks -> // #D let fromTo = new Dictionary<int, int list>() let ops = new Dictionary<int, TaskInfo>() // #E for KeyValue(key, value) in tasks do // #F let operation = { value with EdgesLeft = Some(value.Edges.Length) } for from in operation.Edges do let exists, lstDependencies = fromTo.TryGetValue(from) if not <| exists then fromTo.Add(from, [ operation.Id ]) else fromTo.[from] <- (operation.Id :: lstDependencies) ops.Add(key, operation) ops |> Seq.iter (fun kv -> // #F match kv.Value.EdgesLeft with | Some(n) when n = 0 -> inbox.Post(QueueTask(kv.Value)) | _ -> ()) return! loop ops fromTo | QueueTask(op) -> // #G Async.Start <| async { // #G let start = DateTimeOffset.Now match op.Context with // #H | null -> op.Task.Invoke() |> Async.AwaitATsk | ctx -> ExecutionContext.Run(ctx.CreateCopy(), // #I (fun op -> let opCtx = (op :?> TaskInfo) opCtx.Task.Invoke().ConfigureAwait(false)), taskInfo) let end' = DateTimeOffset.Now onTaskCompleted.Trigger { op with Start = Some(start) End = Some(end') } // #L let exists, deps = edges.TryGetValue(op.Id) if exists && deps.Length > 0 then let depOps = getDependentOperation deps tasks [] edges.Remove(op.Id) |> ignore depOps |> Seq.iter (fun nestedOp -> inbox.Post(QueueTask(nestedOp))) } return! loop tasks edges | AddTask(id, op) -> tasks.Add(id, op) // #M return! loop tasks edges } loop (new Dictionary<int, TaskInfo>(HashIdentity.Structural)) (new Dictionary<int, int list>(HashIdentity.Structural))) [<CLIEventAttribute>] member this.OnTaskCompleted = onTaskCompleted.Publish // #L member this.ExecuteTasks() = dagAgent.Post ExecuteTasks // #N member this.AddTask(id, task, [<ParamArray>] edges : int array) = let data = { Context = ExecutionContext.Capture() Edges = edges; Id = id; Task = task NumRemainingEdges = None; Start = None; End = None } dagAgent.Post(AddTask(id, data)) // #O 


# onTaskCompletedEvent рдХреНрд▓рд╛рд╕ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг, рдЬреЛ рдХрд┐рд╕реА рдХрд╛рд░реНрдп рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реВрдЪрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ

#B рдХрд╛рд░реНрдп рд░рдЬрд┐рд╕реНрдЯрд░ рдФрд░ рдЙрдирдХреА рдирд┐рд░реНрднрд░рддрд╛ рдкрд░ рдирдЬрд╝рд░ рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдЬреЗрдВрдЯ рдХреА рдЖрдВрддрд░рд┐рдХ рд╕реНрдерд┐рддрд┐ред рдХрд▓реЗрдХреНрд╢рди рдкрд░рд╕реНрдкрд░ рднрд┐рдиреНрди рд╣реЛрддреЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ ParallelTasksDAG рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рджреМрд░рд╛рди рд╕реНрдерд┐рддрд┐ рдмрджрд▓ рдЬрд╛рддреА рд╣реИ, рдФрд░ рдЪреВрдВрдХрд┐ рдЙрдиреНрд╣реЗрдВ рдереНрд░реЗрдб рд╕реБрд░рдХреНрд╖рд╛ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓реА рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рдПрдЬреЗрдВрдЯ рдореЗрдВ рд╕реНрдерд┐рдд рд╣реИрдВ

#C рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд░реВрдк рд╕реЗ рдирд┐рд╖реНрдкрд╛рджрди рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░ рд░рд╣рд╛ рд╣реИ

#D рдПрдХ рд╕рдВрджреЗрд╢ рдЬреЛ ParallelTasksDAG рд▓реЙрдиреНрдЪ рдХрд░рддрд╛ рд╣реИ

# рдИ рд╕рдВрдЧреНрд░рд╣ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдХрд╛рд░реНрдп рдХреЗ рд╕рд╛рде рдПрдХ рдиреАрд░рд╕ рд╡реГрджреНрдзрд┐ рд╕реВрдЪрдХрд╛рдВрдХ рдкрд░ рдореИрдк рдХрд┐рдпрд╛ рдЧрдпрд╛

#F рдХрд╛рд░реНрдп рдХреА рд╕реВрдЪреА рдкрд░ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреА рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рд╣реЛрддреА рд╣реИ, рдПрдХ рд╕рд╛рдордпрд┐рдХ рд╕рдВрд░рдЪрдирд╛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдиреНрдп рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд╕рд╛рде рдирд┐рд░реНрднрд░рддрд╛ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рдирд╛ рдЬрд┐рд╕рдореЗрдВ рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдХреНрд░рдо рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ

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

#H рдпрджрд┐ рдПрдХреНрдЬрд╝реАрдХреНрдпреВрд╢рди рдХреЛрдирдЯреЗрдХреНрд╕реНрдЯ null , рддреЛ рдХрд╛рд░реНрдп рдХреЛ рд╡рд░реНрддрдорд╛рди рд╕рдВрджрд░реНрдн рдореЗрдВ рдЪрд▓рд╛рдПрдВ, рдЕрдиреНрдпрдерд╛ #I рдкрд░ рдЬрд╛рдПрдВ

# рдореИрдВ рдХрд╛рд░реНрдп рдХреЛ рдПрдХреНрд╕реЗрдкреНрдЯреЗрдб рдПрдХреНрд╕реЗрдкреНрд╢рдирд┐рдпрдирдЯреЗрдХреНрд╕реНрдЯ рдореЗрдВ рдЪрд▓рд╛рдПрдВ

onTaskCompleted рдФрд░ рдХрд╛рд░реНрдп рдХреЗ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреА рд╕реВрдЪрдирд╛ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП onTaskCompleted рдШрдЯрдирд╛ рдХреЛ рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд░реЗрдВред рдШрдЯрдирд╛ рдореЗрдВ рдХрд╛рд░реНрдп рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рд╣реИред

#M рд╕рдВрджреЗрд╢ рдЖрд╡рд░рдг рдЕрдкрдиреА рдирд┐рд░реНрднрд░рддрд╛ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдХрд╛рд░реНрдп рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдХреЛрдИ рд╣реЛ

#N рдкрдВрдЬреАрдХреГрдд рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдирд┐рд╖реНрдкрд╛рджрди рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реИ

#O DAG рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА рдХрд╛рд░реНрдп, рдЙрд╕рдХреА рдирд┐рд░реНрднрд░рддрд╛ рдФрд░ рд╡рд░реНрддрдорд╛рди ExecutionContext рд╕рдВрджрд░реНрдн рдореЗрдВ рдЬреЛрдбрд╝рдирд╛ред

AddTask рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрджреНрджреЗрд╢реНрдп рдХрд╛рд░реНрдп рдХреЛ рдордирдорд╛рдиреЗ рдврдВрдЧ рд╕реЗ рдирд┐рд░реНрднрд░рддрд╛ рдХрд┐рдирд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рдкрдВрдЬреАрдХреГрдд рдХрд░рдирд╛ рд╣реИред рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдПрдХ рдЕрджреНрд╡рд┐рддреАрдп рдЖрдИрдбреА, рдПрдХ рдХрд╛рд░реНрдп рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдХрдИ рдХрд┐рдирд╛рд░реЛрдВ рдХреЛ рдЕрдиреНрдп рд╕рднреА рдкрдВрдЬреАрдХреГрдд рдХрд╛рд░реНрдпреЛрдВ рдХреА рдЖрдИрдбреА рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддрд╛ рд╣реИ рдЬрд┐рдиреНрд╣реЗрдВ рдЗрд╕ рдХрд╛рд░реНрдп рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдкреВрд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрджрд┐ рд╕рд░рдгреА рдЦрд╛рд▓реА рд╣реИ, рддреЛ рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдХреЛрдИ рдирд┐рд░реНрднрд░рддрд╛ рдирд╣реАрдВ рд╣реИрдВред MailboxProcessor рдирд╛рдордХ рдПрдХ рдЙрджрд╛рд╣рд░рдг dagAgent рд╡рд░реНрддрдорд╛рди рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдкрдВрдЬреАрдХреГрдд рдХрд╛рд░реНрдпреЛрдВ "рдХрд╛рд░реНрдпреЛрдВ" рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдПрдХ рд╢рдмреНрджрдХреЛрд╢ ( tasks : Dictionary<int, TaskInfo> ) рд╣реИ рдЬреЛ рдкреНрд░рддреНрдпреЗрдХ рдХрд╛рд░реНрдп рдХреА рдЖрдИрдбреА рдФрд░ рдЙрд╕рдХреЗ рд╡рд┐рд╡рд░рдг рдХреЛ рд╕рд╣рд╕рдВрдмрдВрдзрд┐рдд рдХрд░рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдПрдЬреЗрдВрдЯ рдкреНрд░рддреНрдпреЗрдХ рдХрд╛рд░реНрдп рдХреА рдЖрдИрдбреА рджреНрд╡рд╛рд░рд╛ рдзрд╛рд░ рдирд┐рд░реНрднрд░рддрд╛ рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рднреА рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИ ( edges : Dictionary<int, int list> )ред рдЬрдм рдПрдХ рдПрдЬреЗрдВрдЯ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрди рд╢реБрд░реВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рд╕реВрдЪрдирд╛ рдорд┐рд▓рддреА рд╣реИ, рддреЛ рдЗрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЗ рд░реВрдк рдореЗрдВ, рдпрд╣ рдЬрд╛рдВрдЪрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдХрд┐рдирд╛рд░реЛрдВ рдХреА рд╕рднреА рдирд┐рд░реНрднрд░рддрд╛рдПрдВ рдкрдВрдЬреАрдХреГрдд рд╣реИрдВ, рдФрд░ рдЧреНрд░рд╛рдлрд╝ рдореЗрдВ рдХреЛрдИ рдЪрдХреНрд░ рдирд╣реАрдВ рд╣реИрдВред рдпрд╣ рд╕рддреНрдпрд╛рдкрди рдЪрд░рдг рдСрдирд▓рд╛рдЗрди рдХреЛрдб рдореЗрдВ рдкреНрд░рджрд╛рди рдХрд┐рдП рдЧрдП ParallelTasksDAG рдХреЗ рдкреВрд░реНрдг рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╣реИред рдЕрдЧрд▓рд╛, рдореИрдВ C # рдореЗрдВ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдкреНрд░рд╕реНрддреБрдд рдХрд░рддрд╛ рд╣реВрдВ, рдЬрд╣рд╛рдВ рдореИрдВ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ F # ParallelTasksDAG рдХреЛ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП (рдФрд░ рдЗрд╕рдХрд╛ рдЙрдкрднреЛрдЧ рдХрд░реЗрдВ)ред рдкрдВрдЬреАрдХреГрдд рдХрд╛рд░реНрдп рдЕрдВрдЬреАрд░ рдореЗрдВ рдКрдкрд░ рджреА рдЧрдИ рдирд┐рд░реНрднрд░рддрд╛ рдХреЛ рджрд░реНрд╢рд╛рддреЗ рд╣реИрдВред 1ред

 Func<int, int, Func<Task>> action = (id, delay) => async () => { Console.WriteLine($тАЭStarting operation{id} in Thread Id {Thread.CurrentThread.ManagedThreadId}тАжтАЭ); await Task.Delay(delay); }; var dagAsync = new DAG.ParallelTasksDAG(); dagAsync.OnTaskCompleted.Subscribe(op => Console.WriteLine($тАЭOperation {op.Id} completed in Thread Id { Thread.CurrentThread.ManagedThreadId}тАЭ)); dagAsync.AddTask(1, action(1, 600), 4, 5); dagAsync.AddTask(2, action(2, 200), 5); dagAsync.AddTask(3, action(3, 800), 6, 5); dagAsync.AddTask(4, action(4, 500), 6); dagAsync.AddTask(5, action(5, 450), 7, 8); dagAsync.AddTask(6, action(6, 100), 7); dagAsync.AddTask(7, action(7, 900)); dagAsync.AddTask(8, action(8, 700)); dagAsync.ExecuteTasks(); 

рд╕рд╣рд╛рдпрдХ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрджреНрджреЗрд╢реНрдп рдПрдХ рд╕рдВрджреЗрд╢ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдирд╛ рд╣реИ рдЬреЛ рдХрд╛рд░реНрдп рд╢реБрд░реВ рд╣реЛ рдЧрдпрд╛ рд╣реИ, рдорд▓реНрдЯреАрдереНрд░реЗрдбрд┐рдВрдЧ рдХреА рдкреБрд╖реНрдЯрд┐ рдХрд░рдиреЗ Id рд╡рд░реНрддрдорд╛рди рдереНрд░реЗрдб рдХреА Id рдЙрд▓реНрд▓реЗрдЦ рдХрд░рддрд╛ рд╣реИред рджреВрд╕рд░реА рдУрд░ OnTaskCompleted , рдХрдВрд╕реЛрд▓ Id рд╡рд░реНрддрдорд╛рди рдереНрд░реЗрдб рдХреЗ рдХрд╛рд░реНрдп ID рдФрд░ Id рдЖрдЙрдЯрдкреБрдЯ рдХреЗ рд╕рд╛рде рдкреНрд░рддреНрдпреЗрдХ рдХрд╛рд░реНрдп рдХреЗ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рдЕрдзрд┐рд╕реВрдЪрдирд╛ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рд▓реЙрдЧ рдСрди рд╣реИред рдпрд╣рд╛рдБ ExecuteTasks рдкрджреНрдзрддрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдкрд░ рдкреНрд░рд╛рдкреНрдд рд╣реЛрдиреЗ рд╡рд╛рд▓рд╛ рдЖрдЙрдЯрдкреБрдЯ рд╣реИред

 Starting operation 8 in Thread Id 23тАж Starting operation 7 in Thread Id 24тАж Operation 8 Completed in Thread Id 23 Operation 7 Completed in Thread Id 24 Starting operation 5 in Thread Id 23тАж Starting operation 6 in Thread Id 25тАж Operation 6 Completed in Thread Id 25 Starting operation 4 in Thread Id 24тАж Operation 5 Completed in Thread Id 23 Starting operation 2 in Thread Id 27тАж Starting operation 3 in Thread Id 30тАж Operation 4 Completed in Thread Id 24 Starting operation 1 in Thread Id 28тАж Operation 2 Completed in Thread Id 27 Operation 1 Completed in Thread Id 28 Operation 3 Completed in Thread Id 30 

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╡рд┐рднрд┐рдиреНрди рдереНрд░реЗрдбреНрд╕ (рдЙрдирдХреЗ рд▓рд┐рдП рдереНрд░реЗрдб ID рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╣реИрдВ) рдореЗрдВ рд╕рдорд╛рдирд╛рдВрддрд░ рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдирд┐рд░реНрднрд░рддрд╛ рдХреЗ рдХреНрд░рдо рдХреЛ рд╕рдВрд░рдХреНрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, рдпрд╣ рд╣реИ рдХрд┐ рдирд┐рд░реНрднрд░рддрд╛ рд╡рд╛рд▓реЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдХреИрд╕реЗ рд╕рдорд╛рдирд╛рдВрддрд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред .NET рдореЗрдВ рдХрд┐рддрд╛рдм рдореЗрдВ рдФрд░ рдЕрдзрд┐рдХ рдкрдврд╝реЗрдВред

Source: https://habr.com/ru/post/hi422571/


All Articles