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

рдЬрдмрдХрд┐
рдереНрд░реЗрдб # 1 рдХреБрдЫ рдХрд░ рд░рд╣рд╛ рдерд╛,
рдереНрд░реЗрдб # 2 рдЕрд╡рд░реБрджреНрдз рд╕рдВрд╕рд╛рдзрди
рдмреАред рдХреБрдЫ рд╕рдордп рдмрд╛рдж,
рдереНрд░реЗрдб # 1 рдиреЗ рд╕рдВрд╕рд╛рдзрди
рдП рдХреЛ рдЕрд╡рд░реБрджреНрдз рдХрд░ рджрд┐рдпрд╛ рдФрд░ рд╕рдВрд╕рд╛рдзрди рдмреА рдХреЛ рдмреНрд▓реЙрдХ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рдерд╛ред рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдРрд╕рд╛ рдХрднреА рдирд╣реАрдВ рд╣реЛрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐
рдереНрд░реЗрдб # 2 рдХреЗрд╡рд▓ рд╕рдВрд╕рд╛рдзрди
рдП рдХреЛ рдЕрд╡рд░реБрджреНрдз рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рд╕рдВрд╕рд╛рдзрди
рдмреА рдХреЛ рдЬрд╛рдиреЗ рджреЗрдЧрд╛
редрджреМрдбрд╝ рдХреА рд╕реНрдерд┐рддрд┐
рд░реЗрд╕-рдХрдВрдбреАрд╢рди рдПрдХ рдРрд╕реА рд╕реНрдерд┐рддрд┐ рд╣реИ рдЬрдм рджреЛрдиреЛрдВ, рдЧрдгрдирд╛ рдХрд╛ рд╡реНрдпрд╡рд╣рд╛рд░ рдФрд░ рдкрд░рд┐рдгрд╛рдо рдирд┐рд╖реНрдкрд╛рджрди рдкрд░реНрдпрд╛рд╡рд░рдг рдХреЗ рдереНрд░реЗрдб рд╢реЗрдбреНрдпреВрд▓рд░ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддреЗ рд╣реИрдВ
рдореБрд╕реАрдмрдд рдпрд╣ рд╣реИ рдХрд┐ рдЖрдкрдХрд╛ рдХрд╛рд░реНрдпрдХреНрд░рдо рд╕реМ рдореЗрдВ рдПрдХ рдмрд╛рд░, рдпрд╛ рдПрдХ рдорд┐рд▓рд┐рдпрди рдореЗрдВ рднреА рдЕрдиреБрдЪрд┐рдд рддрд░реАрдХреЗ рд╕реЗ рдХрд╛рдо рдХрд░ рд╕рдХрддрд╛ рд╣реИред
рдЬрдм рдЪреАрдЬреЗрдВ рдереНрд░реЗрд╢ рдореЗрдВ рдЖрддреА рд╣реИрдВ рддреЛ рд╣рд╛рд▓рд╛рдд рдФрд░ рдЦрд░рд╛рдм рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдереНрд░реЗрдб рд╢реЗрдбреНрдпреВрд▓рд░ рдХреЗ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╡реНрдпрд╡рд╣рд╛рд░ рд╕реЗ рдЖрдкрд╕реА рдЧрддрд┐рд░реЛрдз рдкреИрджрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
рдЗрди рджреЛ рдореБрджреНрджреЛрдВ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЬреЛ рд╕реНрдкрд╖реНрдЯ рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдкреИрджрд╛ рдХрд░рддреЗ рд╣реИрдВ, рдРрд╕реЗ рдореБрджреНрджреЗ рднреА рд╣реИрдВ, рдЬреЛ рдпрджрд┐ рдЧрд▓рдд рдЧрдгрдирд╛ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЗ рд▓рд┐рдП рдЕрдЧреНрд░рдгреА рдирд╣реАрдВ рд╣реИрдВ, рддреЛ рднреА рд╡рд╛рдВрдЫрд┐рдд рдкрд░рд┐рдгрд╛рдо рдХрд╛ рдЙрддреНрдкрд╛рджрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЛ рдЕрдзрд┐рдХ рд╕рдордп рдпрд╛ рд╕рдВрд╕рд╛рдзрди рд▓реЗ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕ рддрд░рд╣ рдХреЗ рджреЛ рдореБрджреНрджреЗ
рд╡реНрдпрд╕реНрдд рдкреНрд░рддреАрдХреНрд╖рд╛ рдФрд░
рдереНрд░реЗрдб рднреБрдЦрдорд░реА рд╣реИрдВ ред
рд╡реНрдпрд╕реНрдд-рдкреНрд░рддреАрдХреНрд╖рд╛
рд╡реНрдпрд╕реНрдд рдкреНрд░рддреАрдХреНрд╖рд╛ рдПрдХ рдореБрджреНрджрд╛ рд╣реИ рдЬреЛ рдЙрд╕ рд╕рдордп рд╣реЛрддрд╛ рд╣реИ рдЬрдм рдкреНрд░реЛрдЧреНрд░рд╛рдо рдкреНрд░реЛрд╕реЗрд╕рд░ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЛ рдЧрдгрдирд╛ рдХреЗ рдмрдЬрд╛рдп рдкреНрд░рддреАрдХреНрд╖рд╛ рдкрд░ рдЦрд░реНрдЪ рдХрд░рддрд╛ рд╣реИред
рдЖрдорддреМрд░ рдкрд░, рдпрд╣ рд╕рдорд╕реНрдпрд╛ рдирд┐рдореНрди рдХреА рддрд░рд╣ рджрд┐рдЦрддреА рд╣реИ:
while(!hasSomethingHappened) ;
рдпрд╣ рдПрдХ рдмреЗрд╣рдж рдЦрд░рд╛рдм рдХреЛрдб рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЖрдкрдХреЗ рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЗ рдПрдХ рдХреЛрд░ рдкрд░ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдХрдмреНрдЬрд╛ рдХрд░ рд▓реЗрддрд╛ рд╣реИ рдЬрдмрдХрд┐ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреБрдЫ рднреА рдЙрддреНрдкрд╛рджрдХ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рддрд░рд╣ рдХреЗ рдХреЛрдб рдХреЛ рддрднреА рдЙрдЪрд┐рдд рдард╣рд░рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬрдм рдХрд┐рд╕реА рдЕрд▓рдЧ рдереНрд░реЗрдб рдореЗрдВ рдореВрд▓реНрдп рдХреЗ рдмрджрд▓рд╛рд╡ рдХреЛ рдЬрд▓реНрджреА рд╕реЗ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд░реВрдк рд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реЛред рдФрд░ 'рдЬрд▓реНрджреА' рд╕реЗ рдореЗрд░рд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдЖрдк рдХреБрдЫ рдиреИрдиреЛрд╕реЗрдХрдВрдб рдХреЗ рд▓рд┐рдП рднреА рдЗрдВрддрдЬрд╛рд░ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред рдЕрдиреНрдп рд╕рднреА рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдЕрд░реНрдерд╛рддреН, рд╕рднреА рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдПрдХ рдЙрдЪрд┐рдд рджрд┐рдорд╛рдЧ рдХреЗ рд╕рд╛рде рдЖ рд╕рдХрддрд╛ рд╣реИ, рдпрд╣ ResetEvent рдФрд░ рдЙрдирдХреЗ рд╕реНрд▓рд┐рдо рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЗ рд░реВрдкрд╛рдВрддрд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИред рд╣рдо рдЙрдирдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдереЛрдбрд╝реА рджреЗрд░ рдмрд╛рдж рдмрд╛рдд рдХрд░реЗрдВрдЧреЗред
рд╢рд╛рдпрдж, рдХреБрдЫ рдкрд╛рдардХреЛрдВ рдиреЗ рд╕реБрдЭрд╛рд╡ рджрд┐рдпрд╛ рдХрд┐ рдереНрд░реЗрдб рдореЗрдВ рд╕реЗ рдПрдХ (рд╕реНрд▓реАрдк) (1) (рдпрд╛ рдХреБрдЫ рдЗрд╕реА рддрд░рд╣) рдХреЛ рдЬреЛрдбрд╝рдХрд░ рдПрдХ рдХреЛрд░ рдХреЗ рдореБрджреНрджреЗ рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдХрдмреНрдЬрд╛ рдХрд░ рд▓рд┐рдпрд╛ рдЬрд╛рдПред рдЬрдмрдХрд┐ рдпрд╣ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рд╣рд▓ рдХрд░реЗрдЧрд╛, рдПрдХ рдирдпрд╛ рдмрдирд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ - рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдкрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХрд░рдиреЗ рдореЗрдВ рд▓рдЧрдиреЗ рд╡рд╛рд▓рд╛ рд╕рдордп рдЕрдм тАЛтАЛрдФрд╕рддрди 0.5 рдПрдордПрд╕ рд╣реЛрдЧрд╛ред рдПрдХ рддрд░рдл, рдпрд╣ рдЗрддрдирд╛ рдЕрдзрд┐рдХ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рджреВрд╕рд░реА рддрд░рдл, рдпрд╣ рдореВрд▓реНрдп рдЙрд╕ рд╕реНрдерд┐рддрд┐ рд╕реЗ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╣реИ рдЬреЛ рд╣рдо рд░реАрд╕реЗрдЯ рдкрд░рд┐рд╡рд╛рд░ рдХреЗ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди рдкреНрд░рд╛рдЗрдореЗрдЯрд┐рд╡ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдзрд╛рдЧрд╛ рднреБрдЦрдорд░реА
рдереНрд░реЗрдб рднреБрдЦрдорд░реА рдПрдХ рдХрд╛рд░реНрдпрдХреНрд░рдо рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╕рдорд╡рд░реНрддреА рд╕рдВрдЪрд╛рд▓рди рд╡рд╛рд▓реЗ рдзрд╛рдЧреЗ рд╣реЛрддреЗ рд╣реИрдВред рдпрд╣рд╛рдВ, рд╣рдо рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдХреБрдЫ IO рд╕реЗ рдЙрддреНрддрд░ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп рдЧрдгрдирд╛ рдХреЗ рд╕рд╛рде рдореМрдЬреВрдж рдереНрд░реЗрдбреНрд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЗ рд╕рд╛рде, рд╣рдо рдереНрд░реЗрдб рдХреЗ рд╕рд╛рде рдЖрдиреЗ рд╡рд╛рд▓реЗ рдХрд┐рд╕реА рднреА рд╕рдВрднрд╛рд╡рд┐рдд рдкреНрд░рджрд░реНрд╢рди рд▓рд╛рдн рдХреЛ рдЦреЛ рджреЗрддреЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдкреНрд░реЛрд╕реЗрд╕рд░ рд╕реНрд╡рд┐рдЪрд┐рдВрдЧ рд╕рдВрджрд░реНрднреЛрдВ рдкрд░ рдмрд╣реБрдд рд╕рдордп рдмрд┐рддрд╛рддрд╛ рд╣реИред
рдЖрдк рд╡рд┐рднрд┐рдиреНрди рдкреНрд░реЛрдлрд╛рдЗрд▓рд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕ рддрд░рд╣ рдХреЗ рдореБрджреНрджреЛрдВ рдХреЛ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВред рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЯрд╛рдЗрдорд▓рд╛рдЗрди рдореЛрдб рдореЗрдВ рдХрд╛рдо рдХрд░ рд░рд╣реЗ
рдбреЙрдЯрдЯреНрд░реЗрд╕ рдкреНрд░реЛрдлрд╛рдЗрд▓рд░ рдХрд╛ рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ рд╣реИ
(рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ)редрдЖрдорддреМрд░ рдкрд░, рдЬреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдереНрд░реЗрдб рднреБрдЦрдорд░реА рд╕реЗ рдкреАрдбрд╝рд┐рдд рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВ, рдЙрдирдореЗрдВ рдереНрд░реЗрдбреНрд╕ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдЪрд╛рд░реНрдЯ рдкрд░ рдХреЛрдИ рдЧреБрд▓рд╛рдмреА рдЦрдВрдб рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╕рдмрд╕рд┐рд╕реНрдЯрдо рд╢реНрд░реЗрдгреА рдореЗрдВ, рд╣рдо рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдХрд╛рд░реНрдпрдХреНрд░рдо 30.6% рд╕рдордп рдХреЗ рд▓рд┐рдП рд╕реАрдкреАрдпреВ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░ рд░рд╣рд╛ рдерд╛ред
рдЬрдм рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рдореБрджреНрджреЗ рдХрд╛ рдирд┐рджрд╛рди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЖрдк рдЗрд╕рдХрд╛ рдзреНрдпрд╛рди рд░рдЦ рд╕рдХрддреЗ рд╣реИрдВ рдмрд╕: рдЖрдкрдиреЗ рдПрдХ рдмрд╛рд░ рдореЗрдВ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдереНрд░реЗрдб рд╢реБрд░реВ рдХрд░ рджрд┐рдП рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдмрд╕ рдХреБрдЫ рдереНрд░реЗрдб рд╢реБрд░реВ рдХрд░реЗрдВред
рддреБрд▓реНрдпрдХрд╛рд▓рди рдХреЗ рддрд░реАрдХреЗ
Interlocked
рдпрд╣ рд╢рд╛рдпрдж рд╕рдмрд╕реЗ рд╣рд▓реНрдХрд╛ рддреБрд▓реНрдпрдХрд╛рд▓рди рд╡рд┐рдзрд┐ рд╣реИред рдЗрдВрдЯрд░рд▓реЙрдХ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╕рд░рд▓ рдкрд░рдорд╛рдгреБ рд╕рдВрдЪрд╛рд▓рди рдХрд╛ рдПрдХ рд╕рдореВрд╣ рд╣реИред рдЬрдм рдПрдХ рдкрд░рдорд╛рдгреБ рдСрдкрд░реЗрд╢рди рдХреЛ рдЕрдВрдЬрд╛рдо рджрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ, рддреЛ рдХреБрдЫ рднреА рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред .NET рдореЗрдВ, рдЗрдВрдЯрд░рд▓реЙрдХ рдХрд┐рдП рдЧрдП рддрд░реАрдХреЛрдВ рдХреЗ рдЪрдпрди рдХреЗ рд╕рд╛рде рдПрдХ рд╣реА рдирд╛рдо рдХреЗ рд╕реНрдерд┐рд░ рд╡рд░реНрдЧ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЙрдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдПрдХ рдкрд░рдорд╛рдгреБ рд╕рдВрдЪрд╛рд▓рди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред
рдЧреИрд░-рдкрд░рдорд╛рдгреБ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рдЕрдВрддрд┐рдо рдЖрддрдВрдХ рдХрд╛ рдПрд╣рд╕рд╛рд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдо рд▓рд┐рдЦрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ рдЬреЛ 10 рдереНрд░реЗрдб рд▓реЙрдиреНрдЪ рдХрд░рддрд╛ рд╣реИ, рдЙрдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдПрдХ рд╣реА рдЪрд░ рдХреЛ рдПрдХ рдорд┐рд▓рд┐рдпрди рд╕реЗ рдЕрдзрд┐рдХ рдмрд╛рд░ рдмрдврд╝рд╛рддрд╛ рд╣реИред рдЬрдм рд╡реЗ рдЕрдкрдиреА рдиреМрдХрд░реА рдХреЗ рд╕рд╛рде рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдЗрд╕ рдЪрд░ рдХреЗ рдореВрд▓реНрдп рдХрд╛ рдЙрддреНрдкрд╛рджрдиред рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдпрд╣ 10 рдорд┐рд▓рд┐рдпрди рд╕реЗ рдмрд╣реБрдд рдЕрд▓рдЧ рд╣реЛрдЧрд╛ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣ рд╣рд░ рдмрд╛рд░ рдЬрдм рдЖрдк рдкреНрд░реЛрдЧреНрд░рд╛рдо рдЪрд▓рд╛рддреЗ рд╣реИрдВ рддреЛ рдЕрд▓рдЧ рд╣реЛрдЧрд╛ред рдРрд╕рд╛ рдЗрд╕рд▓рд┐рдП рд╣реЛрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕ рддрд░рд╣ рдХреЗ рд╕рд░рд▓ рдСрдкрд░реЗрд╢рди рдХреЗ рд░реВрдк рдореЗрдВ рд╡реЗрддрди рд╡реГрджреНрдзрд┐ рднреА рдПрдХ рдкрд░рдорд╛рдгреБ рдирд╣реАрдВ рд╣реИ, рдФрд░ рдЗрд╕рдореЗрдВ рдореЗрдореЛрд░реА рд╕реЗ рдореВрд▓реНрдп рдирд┐рд╖реНрдХрд░реНрд╖рдг, рдирдП рдореВрд▓реНрдп рдХреА рдЧрдгрдирд╛ рдФрд░ рдлрд┐рд░ рд╕реЗ рдореЗрдореЛрд░реА рдореЗрдВ рд▓рд┐рдЦрдирд╛ рд╢рд╛рдорд┐рд▓ рд╣реИред рддреЛ, рджреЛ рдзрд╛рдЧреЗ рдЗрдирдореЗрдВ рд╕реЗ рдХреЛрдИ рднреА рдСрдкрд░реЗрд╢рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдПрдХ рд╡реЗрддрди рд╡реГрджреНрдзрд┐ рдЦреЛ рдЬрд╛рдПрдЧреАред
рдЗрдВрдЯрд░рд▓реЙрдХреНрдб рдХреНрд▓рд╛рд╕ рдЗрдВрдХреНрд░реАрдореЗрдВрдЯ / рдбрд┐рдХреНрд░реАрдореЗрдВрдЯ рдХреЗ рддрд░реАрдХреЗ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдпрд╣ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╡реЗ рдХреНрдпрд╛ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд╣реИрдВред рдпрджрд┐ рдЖрдк рдХрдИ рдереНрд░реЗрдбреНрд╕ рдореЗрдВ рдбреЗрдЯрд╛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдХреБрдЫ рдЧрдгрдирд╛ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рд╡реЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЖрд╕рд╛рди рд╣реИрдВред рдРрд╕рд╛ рдХреЛрдб рдХреНрд▓рд╛рд╕рд┐рдХ рд▓реЙрдХ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдмрд╣реБрдд рддреЗрдЬреА рд╕реЗ рдХрд╛рдо рдХрд░реЗрдЧрд╛ред рдпрджрд┐ рд╣рдордиреЗ рдкрд┐рдЫрд▓реЗ рдкреИрд░рд╛рдЧреНрд░рд╛рдл рдореЗрдВ рд╡рд░реНрдгрд┐рдд рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдЗрдВрдЯрд░рд▓реЙрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рд╣реИ, рддреЛ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХрд┐рд╕реА рднреА рдкрд░рд┐рджреГрд╢реНрдп рдореЗрдВ рдордЬрд╝рдмреВрддреА рд╕реЗ 10 рдорд┐рд▓рд┐рдпрди рдХрд╛ рдореВрд▓реНрдп рдкреИрджрд╛ рдХрд░реЗрдЧрд╛ред
рддреБрд▓рдирд╛рдПрдХреНрд╕рдЪреЗрдВрдЬ рд╡рд┐рдзрд┐ рдХрд╛ рдХрд╛рд░реНрдп рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЗрд╕рдХрд╛ рдЕрд╕реНрддрд┐рддреНрд╡ рдмрд╣реБрдд рд╕рд╛рд░реЗ рд░реЛрдЪрдХ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдмрдирд╛рддрд╛ рд╣реИред рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдд, рддрд╛рд▓рд╛-рдореБрдХреНрдд рдкрд░рд┐рд╡рд╛рд░ рд╕реЗред
public static int CompareExchange (ref int location1, int value, int comparand);
рдпрд╣ рд╡рд┐рдзрд┐ рддреАрди рдорд╛рди рд▓реЗрддреА рд╣реИред рдкрд╣рд▓реЗ рдПрдХ рдХреЛ рдПрдХ рд╕рдВрджрд░реНрдн рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдпрд╣ рдорд╛рди рд╣реИ рдЬреЛ рджреВрд╕рд░реЗ рдХреЗ рд▓рд┐рдП рдмрджрд▓ рдЬрд╛рдПрдЧрд╛ рдпрджрд┐ рд╕реНрдерд╛рди 1 рддреБрд▓рдирд╛ рдХреЗ рдмрд░рд╛рдмрд░ рд╣реЛрдиреЗ рдкрд░ рдкреНрд░рджрд░реНрд╢рди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╕реНрдерд╛рди 1 рдХрд╛ рдореВрд▓ рдореВрд▓реНрдп рд╡рд╛рдкрд╕ рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдпрд╣ рдЬрдЯрд┐рд▓ рд▓рдЧрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдХреЛрдб рдХрд╛ рдПрдХ рдЯреБрдХрдбрд╝рд╛ рд▓рд┐рдЦрдирд╛ рдЖрд╕рд╛рди рд╣реЛрддрд╛ рд╣реИ рдЬреЛ рддреБрд▓рдирд╛рддреНрдордХ рд░реВрдк рд╕реЗ рд╕рдорд╛рди рд╕рдВрдЪрд╛рд▓рди рдХрд░рддрд╛ рд╣реИ:
var original = location1; if (location1 == comparand) location1 = value; return original;
рдЕрдВрддрд░ рдХреЗрд╡рд▓ рдЗрддрдирд╛ рд╣реИ рдХрд┐ рдЗрдВрдЯрд░рд▓рд╛рдХреНрдб рдХреНрд▓рд╛рд╕ рдЗрд╕реЗ рдкрд░рдорд╛рдгреБ рддрд░реАрдХреЗ рд╕реЗ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдпрджрд┐ рд╣рдордиреЗ рдпрд╣ рдХреЛрдб рд╕реНрд╡рдпрдВ рд▓рд┐рдЦрд╛ рд╣реИ, рддреЛ рд╣рдо рдПрдХ рдкрд░рд┐рджреГрд╢реНрдп рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ рд╕реНрдерд┐рддрд┐ рд╕реНрдерд╛рди 1 == рддреБрд▓рдирд╛ рдкрд╣рд▓реЗ рд╣реА рдорд┐рд▓ рдЪреБрдХреА рд╣реИред рд▓реЗрдХрд┐рди рдЬрдм рд╡рд┐рд╡рд░рдг рд╕реНрдерд╛рди 1 = рдорд╛рди рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ, рддреЛ рдПрдХ рдЕрд▓рдЧ рдереНрд░реЗрдб рдиреЗ рдкрд╣рд▓реЗ рд╣реА рд╕реНрдерд╛рди 1 рдорд╛рди рдХреЛ рдмрджрд▓ рджрд┐рдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдЦреЛ рдЬрд╛рдПрдЧрд╛ред
рд╣рдо рдПрдХ рдЕрдЪреНрдЫрд╛ рдЙрджрд╛рд╣рд░рдг рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЗрд╕ рдкрджреНрдзрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЙрд╕ рдХреЛрдб рдореЗрдВ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рдХрдВрдкрд╛рдЗрд▓рд░ рдХрд┐рд╕реА C # рдИрд╡реЗрдВрдЯ рдХреЗ рд▓рд┐рдП рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИред
рдЖрдЗрдП MyEvent рдирд╛рдордХ рдПрдХ рдШрдЯрдирд╛ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рд╛рдзрд╛рд░рдг рд╡рд░реНрдЧ рд▓рд┐рдЦреЗрдВ:
class MyClass { public event EventHandler MyEvent; }
рдЕрдм, рд░рд┐рд▓реАрдЬ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдореЗрдВ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░реЗрдВ рдФрд░ тАЬShow Compiler Generated CodeтАЭ рд╡рд┐рдХрд▓реНрдк рдХреЗ рд╕рд╛рде
dotPeek рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдмрд┐рд▓реНрдб рдХреЛ рдЦреЛрд▓реЗрдВред
[CompilerGenerated] private EventHandler MyEvent; public event EventHandler MyEvent { [CompilerGenerated] add { EventHandler eventHandler = this.MyEvent; EventHandler comparand; do { comparand = eventHandler; eventHandler = Interlocked.CompareExchange<EventHandler>(ref this.MyEvent, (EventHandler) Delegate.Combine((Delegate) comparand, (Delegate) value), comparand); } while (eventHandler != comparand); } [CompilerGenerated] remove {
рдпрд╣рд╛рдВ, рд╣рдо рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╕рдВрдХрд▓рдХ рдиреЗ рдкрд░реНрджреЗ рдХреЗ рдкреАрдЫреЗ рдПрдХ рдмрд▓реНрдХрд┐ рдЬрдЯрд┐рд▓ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдЙрддреНрдкрдиреНрди рдХрд┐рдпрд╛ рд╣реИред рдпрд╣ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рд╣рдореЗрдВ рдЙрд╕ рдШрдЯрдирд╛ рдХреЗ рд▓рд┐рдП рд╕рджрд╕реНрдпрддрд╛ рдЦреЛрдиреЗ рд╕реЗ рд░реЛрдХрддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдХреБрдЫ рдзрд╛рдЧреЗ рдПрдХ рд╕рд╛рде рдЗрд╕ рдШрдЯрдирд╛ рдХреЗ рд▓рд┐рдП рд╕рджрд╕реНрдпрддрд╛ рд▓реЗрддреЗ рд╣реИрдВред рдЖрдЗрдП рдЗрд╕ рдмрд╛рдд рдкрд░ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдкрд░реНрджреЗ рдХреЗ рдкреАрдЫреЗ рддреБрд▓рдирд╛рддреНрдордХ рдкрджреНрдзрддрд┐ рдХреНрдпрд╛ рдХрд░рддреА рд╣реИ:
EventHandler eventHandler = this.MyEvent; EventHandler comparand; do { comparand = eventHandler;
рдпрд╣ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдкреНрд░рдмрдВрдзрдиреАрдп рд╣реИ, рд▓реЗрдХрд┐рди рд╢рд╛рдпрдж рдЕрднреА рднреА рдПрдХ рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдпрд╣ рд╣реИ рдХрд┐ рдореИрдВ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХрд╛ рд╡рд░реНрдгрди рдХреИрд╕реЗ рдХрд░реВрдВрдЧрд╛:
рдпрджрд┐ MyEvent рдЕрднреА рднреА рд╡реИрд╕реА рд╣реА рд╣реИ рдЬреИрд╕рд╛ рдХрд┐ рдЗрд╕ рд╕рдордп рд╣рдордиреЗ Delegate.Combine рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд┐рдпрд╛ рдерд╛, рддреЛ рдЗрд╕реЗ Delegate.Combine рдкрд░ рд╡рд╛рдкрд╕ рд▓реМрдЯрд╛ рджреЗрдВред рдпрджрд┐ рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИ, рддреЛ рддрдм рддрдХ рдлрд┐рд░ рд╕реЗ рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ рдЬрдм рддрдХ рдпрд╣ рдХрд╛рдо рди рдХрд░реЗредрдЗрд╕ рддрд░рд╣, рд╕рджрд╕реНрдпрддрд╛ рдХрднреА рдирд╣реАрдВ рдЦреЛрдПрдЧреАред рдпрджрд┐ рдЖрдк рдПрдХ рдбрд╛рдпрдирд╛рдорд┐рдХ, рдереНрд░реЗрдб-рд╕реЗрдлрд╝, рд▓реЙрдХ-рдлрд╝реНрд░реА рд╕рд░рдгреА рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рддреЛ рдЖрдкрдХреЛ рдПрдХ рд╕рдорд╛рди рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдпрджрд┐ рдХрдИ рдереНрд░реЗрдб рдЕрдЪрд╛рдирдХ рдЙрд╕ рд╕рд░рдгреА рдореЗрдВ рддрддреНрд╡реЛрдВ рдХреЛ рдЬреЛрдбрд╝рдирд╛ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЙрди рд╕рднреА рддрддреНрд╡реЛрдВ рдХреЛ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдЬреЛрдбрд╝рдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред
рдореЙрдиреАрдЯрд░.рдЗрдВрдЯрд░, рдореЙрдиреАрдЯрд░ред рдПрдХреНрд╕рд┐рдЯ, рд▓реЙрдХ
рдЗрди рдирд┐рд░реНрдорд╛рдгреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдереНрд░реЗрдб рд╕рд┐рдВрдХреНрд░реЛрдирд╛рдЗрдЬрд╝реЗрд╢рди рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдмрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╡реЗ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЦрдВрдб рдХреА рдЕрд╡рдзрд╛рд░рдгрд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ: рдЕрд░реНрдерд╛рддреН, рдореЙрдирд┐рдЯрд░.рдЗрдВрдЯрд░ рдФрд░ рдореЙрдирд┐рдЯрд░.рдПрдХреНрд╕рд┐рдЯ рдХреЗ рдХреЙрд▓ рдХреЗ рдмреАрдЪ рд▓рд┐рдЦрд╛ рдХреЛрдб рдХреЗрд╡рд▓ рдПрдХ рдереНрд░реЗрдб рджреНрд╡рд╛рд░рд╛ рдХреЗрд╡рд▓ рдПрдХ рд╕рдордп рдкрд░ рдПрдХ рд╕рдВрд╕рд╛рдзрди рдкрд░ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд▓реЙрдХ рдСрдкрд░реЗрдЯрд░ рдХреЛрд╢рд┐рд╢-рдЕрдВрдд рдореЗрдВ рд▓рд┐рдкрдЯреЗ / рдмрд╛рд╣рд░ рдирд┐рдХрд▓реЗрдВ рдХреЙрд▓ рдХреЗ рдЖрд╕рдкрд╛рд╕ рд╕рд┐рдВрдЯреИрдХреНрд╕-рдЪреАрдиреА рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИред .NET рдореЗрдВ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╕реЗрдХреНрд╢рди рдХрд╛ рдПрдХ рд╕реБрдЦрдж рдЧреБрдг рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рд░реАрдЯрд░реНрд░реЗрдВрд╕реА рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рдХреЛ рдмрд┐рдирд╛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдореБрджреНрджреЛрдВ рдХреЗ рд╕рд╛рде рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
lock(a) { lock (a) { ... } }
рдпрд╣ рд╕рдВрднрд╛рд╡рдирд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдХреЛрдИ рднреА рдЗрд╕ рд╕рдЯреАрдХ рддрд░реАрдХреЗ рд╕реЗ рд▓рд┐рдЦреЗрдЧрд╛, рд▓реЗрдХрд┐рди рдпрджрд┐ рдЖрдк рдХреЙрд▓-рд╕реНрдЯреИрдХ рдХреА рдЧрд╣рд░рд╛рдИ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХреБрдЫ рддрд░реАрдХреЛрдВ рдХреЗ рдмреАрдЪ рдЗрд╕ рдХреЛрдб рдХреЛ рдлреИрд▓рд╛рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рд╕реБрд╡рд┐рдзрд╛ рдЖрдкрдХреЛ рдХреБрдЫ IFs рдмрдЪрд╛ рд╕рдХрддреА рд╣реИред рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕ рдЯреНрд░рд┐рдХ рдХреЗ рд▓рд┐рдП .NET рдХреЗ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЛ рдПрдХ рд▓рд┐рдорд┐рдЯреЗрд╢рди рдЬреЛрдбрд╝рдирд╛ рдерд╛ - рдЖрдк рдХреЗрд╡рд▓ рд░реЗрдлрд░реЗрдВрд╕ рдЯрд╛рдЗрдкреНрд╕ рдХреЗ рдЗрдВрд╕реНрдЯреЗрдВрд╕ рдХреЛ рд╣реА рд╕рд┐рдВрдХреНрд░реЛрдирд╛рдЗрдЬрд╝реЗрд╢рди рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рдХреБрдЫ рдмрд╛рдЗрдЯреНрд╕ рдЬреЛрдбрд╝реЗ рдЬрд╛рддреЗ рд╣реИрдВ рдЬрд╣рд╛рдБ рдереНрд░реЗрдб рдЖрдЗрдбреЗрдВрдЯрд┐рдлрд╛рдпрд░ рд▓рд┐рдЦрд╛ рдЬрд╛рдПрдЧрд╛ред
C # рдореЗрдВ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЕрдиреБрднрд╛рдЧ рдХреА рдХрд╛рд░реНрдп рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреА рдпрд╣ рдЦрд╝рд╛рд╕рд┐рдпрдд рд▓реЙрдХ рдСрдкрд░реЗрдЯрд░ рдкрд░ рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рд╕реАрдорд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреА рд╣реИ: рдЖрдк рд▓реЙрдХ рдСрдкрд░реЗрдЯрд░ рдХреЗ рдЕрдВрджрд░ рдкреНрд░рддреАрдХреНрд╖рд┐рдд рдСрдкрд░реЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЗрд╕рдиреЗ рдореБрдЭреЗ рдЖрд╢реНрдЪрд░реНрдпрдЪрдХрд┐рдд рдХрд░ рджрд┐рдпрд╛ рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕реА рддрд░рд╣ рдХреА рдПрдХ рдХреЛрд╢рд┐рд╢ рдХреЗ рдмрд╛рдж рдореЙрдирд┐рдЯрд░.рдЗрдВрдЯрд░ / рдПрдХреНрдЬрд╝рд┐рдЯ рдирд┐рд░реНрдорд╛рдг рд╕рдВрдХрд▓рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд╕реМрджрд╛ рдХреНрдпрд╛ рд╣реИ? рдкрд┐рдЫрд▓реЗ рдкреИрд░рд╛рдЧреНрд░рд╛рдл рдХреЛ рдлрд┐рд░ рд╕реЗ рдкрдврд╝рдирд╛ рдФрд░ async / рдХрд╛рдо рдХрд░рдиреЗ рдХрд╛ рдХреБрдЫ рдЬреНрдЮрд╛рди рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ: рдкреНрд░рддреАрдХреНрд╖рд╛ рдХреЗ рдмрд╛рдж рдХрд╛ рдХреЛрдб рдЗрдВрддрдЬрд╛рд░ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдХреЛрдб рдХреЗ рд╕рдорд╛рди рдереНрд░реЗрдб рдкрд░ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдпрд╣ рд╕рд┐рдВрдХреНрд░реЛрдирд╛рдЗрдЬрд╝реЗрд╢рди рдХреЗ рд╕рдВрджрд░реНрдн рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдХреЙрдиреНрдлрд┐рдЧрд░рд╡рд╛рдЗрдЯ рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВред рдЗрд╕ рд╕реЗ, рдпрд╣ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд╣реИ рдХрд┐ Monitor.Exit Monitor.Enter рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдПрдХ рдЕрд▓рдЧ рдереНрд░реЗрдб рдкрд░ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬреЛ SynchronizationLockException рдХреЛ рдлреЗрдВрдХ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдпрджрд┐ рдЖрдк рдореБрдЭ рдкрд░ рд╡рд┐рд╢реНрд╡рд╛рд╕ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдХрдВрд╕реЛрд▓ рдХреЛрдб рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рдЪрд▓рд╛рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ - рдпрд╣ рдПрдХ
рд╕рд┐рдВрдХреНрд░реЛрдирд╛рдЗрдЬрд╝реЗрд╢рди рдЙрддреНрдкрдиреНрди рдХрд░реЗрдЧрд╛ред
рдЕрдкрд╡рд╛рдж :
var syncObject = new Object(); Monitor.Enter(syncObject); Console.WriteLine(Thread.CurrentThread.ManagedThreadId); await Task.Delay(1000); Monitor.Exit(syncObject); Console.WriteLine(Thread.CurrentThread.ManagedThreadId);
рдпрд╣ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐, рдПрдХ WinForms рдпрд╛ WPF рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ, рдпрд╣ рдХреЛрдб рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдХрд╛рдо рдХрд░реЗрдЧрд╛ рдпрджрд┐ рдЖрдк рдЗрд╕реЗ рдореБрдЦреНрдп рдереНрд░реЗрдб рд╕реЗ рдХрд╣рддреЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдПрдХ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди рд╕рдВрджрд░реНрдн рд╣реЛрдЧрд╛ рдЬреЛ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж UI-рдереНрд░реЗрдб рдкрд░ рд▓реМрдЯрдиреЗ рд╡рд╛рд▓реЗ рдЙрдкрдХрд░рдгреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред рдХрд┐рд╕реА рднреА рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдХрд┐ рдХрд┐рд╕реА рдРрд╕реЗ рдХреЛрдб рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдорд╣рддреНрд╡рдкреВрд░реНрдг рднреВрдорд┐рдХрд╛ рди рдирд┐рднрд╛рдИ рдЬрд╛рдП, рдЬрд┐рд╕рдореЗрдВ рд╡реЗрдЗрдЯ рдСрдкрд░реЗрдЯрд░ рд╣реЛред рдРрд╕реЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ, рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди рдкреНрд░рд╛рдЗрдореЗрдЯрд┐рд╡ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реИ рдЬрд┐рд╕реЗ рд╣рдо рдмрд╛рдж рдореЗрдВ рдереЛрдбрд╝рд╛ рджреЗрдЦреЗрдВрдЧреЗред
рдЬрдм рд╣рдо .NET рдореЗрдВ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЦрдВрдбреЛрдВ рдХреЗ рд╡рд┐рд╖рдп рдкрд░ рд╣реЛрддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ рд╡реЗ рд▓рд╛рдЧреВ рд╣реЛрдиреЗ рдХреЗ рддрд░реАрдХреЗ рдХреА рдПрдХ рдФрд░ рд╡рд┐рд╢рд┐рд╖реНрдЯрддрд╛ рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд░реЗрдВред .NET рдореЗрдВ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЦрдВрдб рджреЛ рдореЛрдб рдореЗрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ: рд╕реНрдкрд┐рди-рдкреНрд░рддреАрдХреНрд╖рд╛ рдФрд░ рдХреЛрд░-рдкреНрд░рддреАрдХреНрд╖рд╛ред рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд pseudocode рдХреА рддрд░рд╣ рд╕реНрдкрд┐рди-рдкреНрд░рддреАрдХреНрд╖рд╛ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
while(!TryEnter(syncObject)) ;
рдпрд╣ рдЕрдиреБрдХреВрд▓рди рдЗрд╕ рдЖрдзрд╛рд░ рдкрд░ рдХрдо рд╕рдордп рдореЗрдВ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЕрдиреБрднрд╛рдЧ рдХреЛ рдЬрд▓реНрджреА рд╕реЗ рдЬрд▓реНрджреА рдХреИрдкреНрдЪрд░ рдХрд░рдиреЗ рдХреА рджрд┐рд╢рд╛ рдореЗрдВ рдирд┐рд░реНрджреЗрд╢рд┐рдд рд╣реИ, рднрд▓реЗ рд╣реА рд╕рдВрд╕рд╛рдзрди рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдХрдмреНрдЬрд╛ рдХрд░ рд▓рд┐рдпрд╛ рдЧрдпрд╛ рд╣реЛ, рдпрд╣ рдмрд╣реБрдд рдЬрд▓реНрдж рд╣реА рдЬрд╛рд░реА рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдпрджрд┐ рдпрд╣ рдХрдо рд╕рдордп рдореЗрдВ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдереНрд░реЗрдб рдХреЛрд░ рдореЛрдб рдореЗрдВ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рд┐рдЪ рдХрд░реЗрдЧрд╛, рдЬрд┐рд╕рдореЗрдВ рд╕рдордп рд▓рдЧрддрд╛ рд╣реИ - рдмрд╕ рдкреНрд░рддреАрдХреНрд╖рд╛ рд╕реЗ рд╡рд╛рдкрд╕ рдЬрд╛рдиреЗ рдХреЗ рд░реВрдк рдореЗрдВред .NET рдХреЗ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдиреЗ рдпрдерд╛рд╕рдВрднрд╡ рдЫреЛрдЯреЗ рдмреНрд▓реЙрдХ рдХреЗ рдкрд░рд┐рджреГрд╢реНрдп рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд┐рдпрд╛ рд╣реИред рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдпрджрд┐ рдХрдИ рдзрд╛рдЧреЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЦрдВрдб рдХреЛ рдЕрдкрдиреЗ рдмреАрдЪ рдЦреАрдВрдЪрдирд╛ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рд╕реАрдкреАрдпреВ рдкрд░ рдЕрдЪрд╛рдирдХ рдЙрдЪреНрдЪ рднрд╛рд░ рдХрд╛ рдХрд╛рд░рдг рдмрди рд╕рдХрддрд╛ рд╣реИред
рд╕реНрдкрд┐рдирд▓реЙрдХ, рд╕реНрдкрд┐рдирд╡рд╛рдЗрдЯ
рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЪрдХреНрд░реАрдп рдкреНрд░рддреАрдХреНрд╖рд╛ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо (рд╕реНрдкрд┐рди-рдкреНрд░рддреАрдХреНрд╖рд╛) рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдпрд╣ рдмреАрд╕реАрдПрд▓ рд╕реЗ рд╕реНрдкрд┐рдирд▓реЙрдХ рдФрд░ рд╕реНрдкрд┐рдирд╡рд╛рдЗрдЯ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рдиреЗ рд▓рд╛рдпрдХ рд╣реИред рдЖрдкрдХреЛ рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдЕрдЧрд░ рдорд╛рди рд▓реЗрдВ рдХрд┐ рдпрд╣ рдмрд╣реБрдд рдЬрд▓реНрджреА рдмреНрд▓реЙрдХ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рд╣рдореЗрд╢рд╛ рд╕рдВрднрд╡ рд╣реЛрдЧрд╛ред рджреВрд╕рд░реА рдУрд░, рдЖрдкрдХреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЙрдирдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рд╕реЛрдЪрдирд╛ рдЪрд╛рд╣рд┐рдП рдЬрдм рддрдХ рдХрд┐ рдкреНрд░реЛрдлрд╛рдЗрд▓рд┐рдВрдЧ рдкрд░рд┐рдгрд╛рдо рдпрд╣ рдирд╣реАрдВ рджрд┐рдЦрд╛рдПрдЧрд╛ рдХрд┐ рдЖрдкрдХреЗ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреА рдЕрдбрд╝рдЪрди рдЕрдиреНрдп рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди рдкреНрд░рд╛рдЗрдореЗрдЯрд┐рд╡ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдХрд╛рд░рдг рд╣реИред
рдореЙрдиреАрдЯрд░.рд╡реЗрдЯ, рдореЙрдиреАрдЯрд░.рдкреБрд▓рд┐рд╕ [рд╕рднреА]
рд╣рдореЗрдВ рдЗрди рджреЛрдиреЛрдВ рддрд░реАрдХреЛрдВ рдХреЛ рдЕрдЧрд▓-рдмрдЧрд▓ рджреЗрдЦрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЙрдирдХреА рдорджрдж рд╕реЗ, рдЖрдк рд╡рд┐рднрд┐рдиреНрди рдирд┐рд░реНрдорд╛рддрд╛-рдЙрдкрднреЛрдХреНрддрд╛ рдкрд░рд┐рджреГрд╢реНрдпреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдирд┐рд░реНрдорд╛рддрд╛-рдЙрдкрднреЛрдХреНрддрд╛ рдмрд╣реБ-рдкреНрд░рдХреНрд░рд┐рдпрд╛ / рдмрд╣реБ-рдереНрд░реЗрдбреЗрдб рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд╛ рдПрдХ рдкреИрдЯрд░реНрди рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдПрдХ рдпрд╛ рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рдереНрд░реЗрдб / рдкреНрд░рдХреНрд░рд┐рдпрд╛рдПрдБ рд╣реЛрддреА рд╣реИрдВ рдЬреЛ рдбреЗрдЯрд╛ рдХрд╛ рдЙрддреНрдкрд╛рджрди рдХрд░рддреА рд╣реИрдВ рдФрд░ рдПрдХ рдпрд╛ рдЕрдзрд┐рдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдПрдБ / рдереНрд░реЗрдб рдЬреЛ рдЗрд╕ рдбреЗрдЯрд╛ рдХреЛ рдкреНрд░реЛрд╕реЗрд╕ рдХрд░рддреЗ рд╣реИрдВред рдЖрдорддреМрд░ рдкрд░, рдПрдХ рд╕рд╛рдЭрд╛ рд╕рдВрдЧреНрд░рд╣ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдЗрди рджреЛрдиреЛрдВ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдХреЗрд╡рд▓ рдПрдХ рдереНрд░реЗрдб рджреНрд╡рд╛рд░рд╛ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдПрдХ рдмреНрд▓реЙрдХ рд╣реИред рдкреНрд░рддреАрдХреНрд╖рд╛ рд╡рд┐рдзрд┐ рдмреНрд▓реЙрдХ рдХреЛ рдореБрдХреНрдд рдХрд░ рджреЗрдЧреА рдФрд░ рддрдм рддрдХ рдлреНрд░реАрдЬ рдХрд░реЗрдЧреА рдЬрдм рддрдХ рдХрд┐ рдПрдХ рдФрд░ рдзрд╛рдЧрд╛ рдкрд▓реНрд╕ рдХреЛ рдХреЙрд▓ рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред
рдЗрд╕рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдХреЗ рд░реВрдк рдореЗрдВ, рдореИрдВрдиреЗ рдПрдХ рдЫреЛрдЯрд╛ рд╕рд╛ рдЙрджрд╛рд╣рд░рдг рд▓рд┐рдЦрд╛:
object syncObject = new object(); Thread t1 = new Thread(T1); t1.Start(); Thread.Sleep(100); Thread t2 = new Thread(T2); t2.Start();
(рдореИрдВ рдЕрдиреБрджреЗрд╢ рдирд┐рд╖реНрдкрд╛рджрди рдЖрджреЗрд╢ рдХреЛ рд╕рдЯреАрдХ рд░реВрдк рд╕реЗ рджрд┐рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд╛рда рдХреЗ рдмрдЬрд╛рдп рдПрдХ рдЫрд╡рд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ)рд╡реНрдпрд╛рдЦреНрдпрд╛: рдореИрдВрдиреЗ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЧрд╛рд░рдВрдЯреА рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рджреВрд╕рд░рд╛ рдзрд╛рдЧрд╛ рд╢реБрд░реВ рдХрд░рддреЗ рд╕рдордп рдПрдХ 100-рдПрдордПрд╕ рд╡рд┐рд▓рдВрдмрддрд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХреА рд╣реИ рдХрд┐ рдЗрд╕реЗ рдмрд╛рдж рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
- T1: рдкрдВрдХреНрддрд┐ # 2 рдзрд╛рдЧрд╛ рд╢реБрд░реВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ
- T1: рд▓рд╛рдЗрди # 3 рдзрд╛рдЧрд╛ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЦрдВрдб рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдХрд░рддрд╛ рд╣реИ
- T1: рд▓рд╛рдЗрди # 6 рдзрд╛рдЧрд╛ рд╕реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╛рддрд╛ рд╣реИ
- рдЯреА 2: рдкрдВрдХреНрддрд┐ # 3 рдзрд╛рдЧрд╛ рд╢реБрд░реВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ
- рдЯреА 2: рд▓рд╛рдЗрди # 4 рдпрд╣ рдЬрдорд╛ рджреЗрддрд╛ рд╣реИ рдФрд░ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЦрдВрдб рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рддрд╛ рд╣реИ
- T1: рд▓рд╛рдЗрди # 7 рдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╕реЗрдХреНрд╢рди рдХреЛ рдЬрд╛рдиреЗ рджреЗрддрд╛ рд╣реИ рдФрд░ рдкрд▓реНрд╕ рдХреЗ рдмрд╛рд╣рд░ рдЖрдиреЗ рдХреЗ рдЗрдВрддрдЬрд╛рд░ рдореЗрдВ рдЬрдо рдЬрд╛рддрд╛ рд╣реИ
- рдЯреА 2: рд▓рд╛рдЗрди # 8 рдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЕрдиреБрднрд╛рдЧ рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдХрд░рддреА рд╣реИ
- T2: рд▓рд╛рдЗрди # 11 рдпрд╣ рдкрд▓реНрд╕ рдХреА рдорджрдж рд╕реЗ T1 рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ
- T2: рд▓рд╛рдЗрди # 14 рдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЦрдВрдб рд╕реЗ рдмрд╛рд╣рд░ рдЖрддрд╛ рд╣реИред рдРрд╕рд╛ рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ T1 рдЕрдкрдиреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХреЛ рдЬрд╛рд░реА рдирд╣реАрдВ рд░рдЦ рд╕рдХрддрд╛ рд╣реИред
- T1: рд▓рд╛рдЗрди # 15 рдпрд╣ рдкреНрд░рддреАрдХреНрд╖рд╛ рд╕реЗ рдирд┐рдХрд▓рддреА рд╣реИ
- T1: рд▓рд╛рдЗрди # 16 рдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЦрдВрдб рд╕реЗ рдирд┐рдХрд▓рддреА рд╣реИ
рдкрд▓реНрд╕ / рдкреНрд░рддреАрдХреНрд╖рд╛ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ MSDN рдореЗрдВ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЯрд┐рдкреНрдкрдгреА рд╣реИ: рдореЙрдирд┐рдЯрд░ рд░рд╛рдЬреНрдп рдХреА рдЬрд╛рдирдХрд╛рд░реА рд╕рдВрдЧреНрд░рд╣реАрдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдкреНрд░рддреАрдХреНрд╖рд╛ рд╡рд┐рдзрд┐ рд╕реЗ рдкрд╣рд▓реЗ рдкрд▓реНрд╕ рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рд╕реЗ рдЧрддрд┐рд░реЛрдз рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдпрджрд┐ рдРрд╕рд╛ рдХреЛрдИ рдорд╛рдорд▓рд╛ рд╕рдВрднрд╡ рд╣реИ, рддреЛ ResetEvent рдкрд░рд┐рд╡рд╛рд░ рд╕реЗ рдХрд┐рд╕реА рдПрдХ рд╡рд░реНрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реИредрдкрд┐рдЫрд▓рд╛ рдЙрджрд╛рд╣рд░рдг рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рджрд┐рдЦрд╛рддрд╛ рд╣реИ рдХрд┐ рдореЙрдирд┐рдЯрд░ рд╡рд░реНрдЧ рдХреЗ рдкреНрд░рддреАрдХреНрд╖рд╛ / рдкрд▓реНрд╕ рддрд░реАрдХреЗ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА рдЙрди рдорд╛рдорд▓реЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдкреНрд░рд╢реНрди рдЫреЛрдбрд╝рддреЗ рд╣реИрдВ рдЬрд┐рдирдореЗрдВ рд╣рдореЗрдВ рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрд╕рдХрд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рдЙрджрд╛рд╣рд░рдг рдмреНрд▓реЙрдХрд┐рдВрдЧрдХреНрдпреВ <рдЯреА> рдХрд╛
рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИред рджреВрд╕рд░реА рдУрд░, System.Collections.Concurrent рд╕реЗ рдмреНрд▓реЙрдХрд┐рдВрдЧрдХреЙрд▓рд┐рдиреЗрд╢рди <T> рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди рдХреЗ рд▓рд┐рдП SemaphoreSlim рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред
ReaderWriterLockSlim
рдореБрдЭреЗ рдЗрд╕ рд╕рд┐рдВрдХреНрд░реЛрдирд╛рдЗрдЬрд╝реЗрд╢рди рдЖрджрд┐рдо рд╕реЗ рдмрд╣реБрдд рдкреНрдпрд╛рд░ рд╣реИ, рдФрд░ рдпрд╣ System.Threading рдирд╛рдорд╕реНрдерд╛рди рд╕реЗ рдЙрд╕реА рдирд╛рдо рдХреЗ рд╡рд░реНрдЧ рджреНрд╡рд╛рд░рд╛ рджрд░реНрд╢рд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрджрд┐ рдЙрдирдХреЗ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдиреЗ рдорд╛рдирдХ рд▓реЙрдХ рдХреЗ рдмрдЬрд╛рдп рдЗрд╕ рд╡рд░реНрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рддреЛ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдХрд╛рд░реНрдпрдХреНрд░рдо рдмрд╣реБрдд рдмреЗрд╣рддрд░ рдХрд╛рдо рдХрд░реЗрдВрдЧреЗред
рд╡рд┐рдЪрд╛рд░: рдмрд╣реБрдд рд╕рд╛рд░реЗ рд╕реВрддреНрд░ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдХреЗрд╡рд▓ рдПрдХ рд╣реА рд▓рд┐рдЦ рд╕рдХрддрд╛ рд╣реИред рдЬрдм рдХреЛрдИ рд╕реВрддреНрд░ рд▓рд┐рдЦрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ, рддреЛ рдирдП рдкрд╛рда рд╢реБрд░реВ рдирд╣реАрдВ рдХрд┐рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ - рд╡реЗ рд▓реЗрдЦрди рдХреЗ рдЕрдВрдд рддрдХ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░реЗрдВрдЧреЗред рдЕрдкрдЧреНрд░реЗрдбреЗрдмрд▓-рд░реАрдб-рд▓реЙрдХ рдХреЙрдиреНрд╕реЗрдкреНрдЯ рднреА рд╣реИред рдЖрдк рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рддрдм рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрдм рдкрдврд╝рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рджреМрд░рд╛рди, рдЖрдк рд╕рдордЭрддреЗ рд╣реИрдВ рдХрд┐ рдХреБрдЫ рд▓рд┐рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ - рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рд▓реЙрдХ рдХреЛ рдПрдХ рдкрд░рдорд╛рдгреБ рдСрдкрд░реЗрд╢рди рдореЗрдВ рд░рд╛рдЗрдЯ-рд▓реЙрдХ рдореЗрдВ рдмрджрд▓ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
System.Threading рдирд╛рдо рд╕реНрдерд╛рди рдореЗрдВ, ReadWriteLock рд╡рд░реНрдЧ рднреА рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕реЗ рдирдП рд╡рд┐рдХрд╛рд╕ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рдиреЗ рдХреА рдЕрддреНрдпрдзрд┐рдХ рдЕрдиреБрд╢рдВрд╕рд╛ рдХреА рдЬрд╛рддреА рд╣реИред рд╕реНрд▓рд┐рдо рд╕рдВрд╕реНрдХрд░рдг рдЙрди рдорд╛рдорд▓реЛрдВ рд╕реЗ рдмрдЪрдиреЗ рдореЗрдВ рдорджрдж рдХрд░реЗрдЧрд╛ рдЬреЛ рдЧрддрд┐рд░реЛрдз рдХреА рдУрд░ рд▓реЗ рдЬрд╛рддреЗ рд╣реИрдВ рдФрд░ рдХреЛрд░ рдореЛрдб рдкрд░ рдЬрд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рд╕реНрдкрд┐рди-рд╡реЗрдЯ рдореЛрдб рдореЗрдВ рд╕рд┐рдВрдХреНрд░реЛрдирд╛рдЗрдЬрд╝реЗрд╢рди рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдмреНрд▓реЙрдХ рдХреЛ рддреБрд░рдВрдд рдХреИрдкреНрдЪрд░ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВред
рдпрджрд┐ рдЖрдк рдЗрд╕ рд▓реЗрдЦ рдХреЛ рдкрдврд╝рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЗрд╕ рд╡рд░реНрдЧ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рдЬрд╛рдирддреЗ рд╣реИрдВ, рддреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЕрдм рддрдХ рдЖрдкрдиреЗ рд╣рд╛рд▓ рд╣реА рдореЗрдВ рд▓рд┐рдЦреЗ рдЧрдП рдХреЛрдб рд╕реЗ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЛ рдпрд╛рдж рдХрд┐рдпрд╛ рд╣реЛрдЧрд╛, рдЬрд╣рд╛рдБ рдмреНрд▓реЙрдХреЛрдВ рдХреЗ рд▓рд┐рдП рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдиреЗ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЛ рдкреНрд░рднрд╛рд╡реА рдврдВрдЧ рд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреА рдереАред
ReaderWriterLockSlim рд╡рд░реНрдЧ рдХрд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╕рд░рд▓ рдФрд░ рд╕рдордЭрдиреЗ рдореЗрдВ рдЖрд╕рд╛рди рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд░рд╛рдорджрд╛рдпрдХ рдирд╣реАрдВ рд╣реИ:
var @lock = new ReaderWriterLockSlim(); @lock.EnterReadLock(); try {
рдореИрдВ рдЖрдорддреМрд░ рдкрд░ рдЗрд╕реЗ рдПрдХ рдХрдХреНрд╖рд╛ рдореЗрдВ рд▓рдкреЗрдЯрдирд╛ рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реВрдВ - рдпрд╣ рдЗрд╕реЗ рдмрд╣реБрдд рдЖрд╕рд╛рди рдмрдирд╛рддрд╛ рд╣реИред
Idea: Read / WriteLock рдореЗрдердб рдмрдирд╛рдПрдВ рдЬреЛ рдХрд┐рд╕реА рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ Dispose рдореЗрдердб рдХреЗ рд╕рд╛рде рд▓реМрдЯрд╛рддрд╛ рд╣реИред рддрдм рдЖрдк рдЙрдиреНрд╣реЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдЬрдм рдпрд╣ рд▓рд╛рдЗрдиреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдЖрддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдорд╛рдирдХ рд▓реЙрдХ рд╕реЗ рдмрд╣реБрдд рдЕрдзрд┐рдХ рднрд┐рдиреНрди рдирд╣реАрдВ рд╣реЛрдЧрд╛ред class RWLock : IDisposable { public struct WriteLockToken : IDisposable { private readonly ReaderWriterLockSlim @lock; public WriteLockToken(ReaderWriterLockSlim @lock) { this.@lock = @lock; @lock.EnterWriteLock(); } public void Dispose() => @lock.ExitWriteLock(); } public struct ReadLockToken : IDisposable { private readonly ReaderWriterLockSlim @lock; public ReadLockToken(ReaderWriterLockSlim @lock) { this.@lock = @lock; @lock.EnterReadLock(); } public void Dispose() => @lock.ExitReadLock(); } private readonly ReaderWriterLockSlim @lock = new ReaderWriterLockSlim(); public ReadLockToken ReadLock() => new ReadLockToken(@lock); public WriteLockToken WriteLock() => new WriteLockToken(@lock); public void Dispose() => @lock.Dispose(); }
рдпрд╣ рд╣рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛ рдХреЛрдб рдореЗрдВ рдмрд╛рдж рдореЗрдВ рд▓рд┐рдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ:
var rwLock = new RWLock();
ResetEvent рдкрд░рд┐рд╡рд╛рд░
рдореИрдВ рдЗрд╕ рдкрд░рд┐рд╡рд╛рд░ рдореЗрдВ рдирд┐рдореНрди рд╡рд░реНрдЧ рд╢рд╛рдорд┐рд▓ рдХрд░рддрд╛ рд╣реВрдВ: ManualResetEvent, ManualResetEventSlim, рдФрд░ AutoResetEventред
ManualResetEvent рдХреНрд▓рд╛рд╕, рдЗрд╕рдХрд╛ рд╕реНрд▓рд┐рдо рд╡рд░реНрдЬрди рдФрд░ AutoResetEvent рдХреНрд▓рд╛рд╕ рджреЛ рд░рд╛рдЬреНрдпреЛрдВ рдореЗрдВ рдореМрдЬреВрдж рд╣реЛ рд╕рдХрддреА рд╣реИ:
- рдЧреИрд░-рд╕рдВрдХреЗрддрд┐рдд - рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рд╕рднреА рдереНрд░реЗрдбреНрд╕, рдЬрд┐рдиреНрд╣реЛрдВрдиреЗ WaitOne рдХреЛ рдлреНрд░реАрдЬ рдХрд╣рд╛ рд╣реИ, рдЬрдм рддрдХ рдХрд┐ рдШрдЯрдирд╛ рд╕рд┐рдЧреНрдирд▓ рд╡рд╛рд▓реЗ рд░рд╛рдЬреНрдп рдореЗрдВ рд╕реНрд╡рд┐рдЪ рдирд╣реАрдВ рд╣реЛ рдЬрд╛рддреАред
- рд╕рдВрдХреЗрддрд┐рдд - рдЗрд╕ рдЕрд╡рд╕реНрдерд╛ рдореЗрдВ, рд╡реЗрдЯрдСрди рдХреЙрд▓ рдкрд░ рдкрд╣рд▓реЗ рд╕реЗ рдЬрдореЗ рд╣реБрдП рд╕рднреА рдереНрд░реЗрдб рдЬрд╛рд░реА рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рдПрдХ рд╕рдВрдХреЗрддрд┐рдд рдШрдЯрдирд╛ рдкрд░ рд╕рднреА рдирдП WaitOne рдХреЙрд▓ рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рддреНрд╡рд░рд┐рдд рд░реВрдк рд╕реЗ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред
AutoResetEvent рдореИрдиреНрдпреБрдЕрд▓ResetEvent рд╕реЗ рднрд┐рдиреНрди рд╣реИ рдХрд┐ рдпрд╣
рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рдереНрд░реЗрдб рдХреЛ рдЬрд╛рд░реА рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдЧреИрд░-рд╕рдВрдХреЗрддрд┐рдд рд╕реНрдерд┐рддрд┐ рдкрд░ рд╕реНрд╡рд┐рдЪ рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ AutoResetEvent рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рддреЗ рд╕рдордп рдХреБрдЫ рдереНрд░реЗрдбреНрд╕ рдЬрдореЗ рд╣реБрдП рд╣реИрдВ, рддреЛ рдХреЙрд▓рд┐рдВрдЧ рд╕реЗрдЯ рдХреЗрд╡рд▓ рдПрдХ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдереНрд░реЗрдб рдЬрд╛рд░реА рдХрд░реЗрдЧрд╛, рдЬреИрд╕рд╛ рдХрд┐ ManualResetEvent рдХреЗ рд╡рд┐рдкрд░реАрдд рд╣реИ рдЬреЛ рд╕рднреА рдереНрд░реЗрдбреНрд╕ рдХреЛ рд░рд┐рд▓реАрдЬрд╝ рдХрд░рддрд╛ рд╣реИред
рдЖрдЗрдП рдПрдХ рдЙрджрд╛рд╣рд░рдг рджреЗрдЦреЗрдВ рдХрд┐ AutoResetEvent рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ:
AutoResetEvent evt = new AutoResetEvent(false); Thread t1 = new Thread(T1); t1.Start(); Thread.Sleep(100); Thread t2 = new Thread(T2); t2.Start();

рдЗрди рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ, рд╣рдо рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдИрд╡реЗрдВрдЯ рдПрдХ рд╕рд┐рдЧреНрдирд▓рдСрди рдкрд░ рдЬрдореЗ рд╣реБрдП рдзрд╛рдЧреЗ рдХреЛ рдЬрд╛рд░реА рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рд╣реА рдЧреИрд░-рд╕рд┐рдЧреНрдирд▓ рд╡рд╛рд▓реЗ рд░рд╛рдЬреНрдп рдореЗрдВ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд╕реНрд╡рд┐рдЪ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред
ReaderWriterLock рдХреЗ рд╡рд┐рдкрд░реАрдд, ManualResetEvent рдХреЛ рдЗрд╕рдХреЗ рд╕реНрд▓рд┐рдо рд╡рд░реНрдЬрди рдХреЗ рдкреНрд░рдХрдЯ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рднреА рдЕрдкреНрд░рдЪрд▓рд┐рдд рдирд╣реАрдВ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред рд╕реНрдкрд┐рди-рд╡реЗрдЯ рдореЛрдб рдореЗрдВ рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рд╢реЙрд░реНрдЯ рд╡реЗрдЯ рдХреЗ рд▓рд┐рдП рдХреНрд▓рд╛рд╕ рдХрд╛ рдпрд╣ рд╕реНрд▓рд┐рдо рд╡рд░реНрдЬрди рдкреНрд░рднрд╛рд╡реА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ; рдорд╛рдирдХ рд╕рдВрд╕реНрдХрд░рдг рд▓рдВрдмреЗ рдЗрдВрддрдЬрд╛рд░ рдХреЗ рд▓рд┐рдП рдЕрдЪреНрдЫрд╛ рд╣реИред
рдореИрдиреБрдЕрд▓рдЗрд╕реЗрдЯрдЗрд╡реЗрдВрдЯ рдФрд░ рдСрдЯреЛрдЗрд╕реЗрдЯрдЗрд╡реЗрдВрдЯ рдХрдХреНрд╖рд╛рдУрдВ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдХрд╛рдЙрдВрдЯрдбрд╛рдЙрдирд╡реЗрдВрдЯ рдХреНрд▓рд╛рд╕ рднреА рд╣реИред рдпрд╣ рд╡рд░реНрдЧ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рд╣реИ рдЬреЛ рдПрдХ рд╕рдорд╛рдирд╛рдВрддрд░ рдЦрдВрдб рдХреЗ рдмрд╛рдж рдПрдХ рд╕рд╛рде рдкрд░рд┐рдгрд╛рдо рдорд┐рд▓рд╛рддрд╛ рд╣реИред рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЛ
рдХрд╛рдВрдЯреЗ-рдЬреБрдбрд╝рдиреЗ рдХреЗ рд░реВрдк рдореЗрдВ рдЬрд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕ рд╡рд░реНрдЧ рдХреЗ рд▓рд┐рдП рдПрдХ рдмреЗрд╣рддрд░реАрди
рд▓реЗрдЦ рд╕рдорд░реНрдкрд┐рдд рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдпрд╣рд╛рдБ рдЗрд╕рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд╡рд░реНрдгрди рдирд╣реАрдВ рдХрд░реВрдБрдЧрд╛ред
рдирд┐рд╖реНрдХрд░реНрд╖
- рдереНрд░реЗрдбреНрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╕рдордп, рджреЛ рдореБрджреНрджреЗ рд╣реИрдВ рдЬреЛ рдЧрд▓рдд рдкрд░рд┐рдгрд╛рдо рдпрд╛ рдкрд░рд┐рдгрд╛рдо рдХреА рдЕрдиреБрдкрд╕реНрдерд┐рддрд┐ рдХрд╛ рдХрд╛рд░рдг рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ - рджреМрдбрд╝ рдХреА рд╕реНрдерд┐рддрд┐ рдФрд░ рдЧрддрд┐рд░реЛрдзред
- рд╕рдорд╕реНрдпрд╛рдПрдБ рдЬреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ рдЕрдзрд┐рдХ рд╕рдордп рдмрд┐рддрд╛ рд╕рдХрддреА рд╣реИрдВ рдпрд╛ рд╕рдВрд╕рд╛рдзрди рдереНрд░реЗрдб рднреБрдЦрдорд░реА рдФрд░ рд╡реНрдпрд╕реНрдд рдкреНрд░рддреАрдХреНрд╖рд╛ рд╣реИрдВред
- .NET рдереНрд░реЗрдб рдХреЛ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рд╕рд╛рд░реЗ рддрд░реАрдХреЗ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред
- рдмреНрд▓реЙрдХ рд╡реЗрдЯ рдХреЗ рджреЛ рддрд░реАрдХреЗ рд╣реИрдВ - рд╕реНрдкрд┐рди рдкреНрд░рддреАрдХреНрд╖рд╛ рдФрд░ рдХреЛрд░ рдкреНрд░рддреАрдХреНрд╖рд╛ред .NET рдореЗрдВ Som.e рдереНрд░реЗрдб рд╕рд┐рдВрдХреНрд░реЛрдирд╛рдЗрдЬрд╝реЗрд╢рди рдкреНрд░рд╛рдЗрдореЗрдЯрд┐рд╡ рджреЛрдиреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред
- рдЗрдВрдЯрд░рд▓реЙрдХреНрдб рдкрд░рдорд╛рдгреБ рдкрд░рд┐рдЪрд╛рд▓рдиреЛрдВ рдХрд╛ рдПрдХ рд╕рдореВрд╣ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд▓реЙрдХ-рдлреНрд░реА рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рд╕рдмрд╕реЗ рддреЗрдЬрд╝ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди рдЖрджрд┐рдо рд╣реИред
- рд▓реЙрдХ рдФрд░ рдореЙрдирд┐рдЯрд░ред рдПрдВрдЯрд░ / рдПрдХреНрдЬрд┐рдЯ рдСрдкрд░реЗрдЯрд░ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЦрдВрдб рдХреА рдЕрд╡рдзрд╛рд░рдгрд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ - рдПрдХ рдХреЛрдб рдЯреБрдХрдбрд╝рд╛ рдЬрд┐рд╕реЗ рдХреЗрд╡рд▓ рдПрдХ рд╕рдордп рдореЗрдВ рдПрдХ рдереНрд░реЗрдб рджреНрд╡рд╛рд░рд╛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
- рдирд┐рд░реНрдорд╛рддрд╛-рдЙрдкрднреЛрдХреНрддрд╛ рдкрд░рд┐рджреГрд╢реНрдпреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП Monitor.Pulse / Wait рдореЗрдердб рдЙрдкрдпреЛрдЧреА рд╣реИрдВред
- рдЬрдм рд╕рдорд╛рдирд╛рдВрддрд░ рд░реАрдбрд┐рдВрдЧ рдХреА рдЙрдореНрдореАрдж рдХреА рдЬрд╛рддреА рд╣реИ рддреЛ ReaderWriterLockSlim рдорд╛рдирдХ рд▓реЙрдХрд┐рдВрдЧ рдорд╛рдорд▓реЛрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
- рдереНрд░реЗрдб рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди рдХреЗ рд▓рд┐рдП ResetEvent рд╡рд░реНрдЧ рдкрд░рд┐рд╡рд╛рд░ рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИред