рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдЬреЛ рдЕрдкрдиреЗ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдореЗрдВ рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рдереНрд░реЗрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдЙрд╕реЗ рд╕рд┐рдВрдХреНрд░реЛрдирд╛рдЗрдЬрд╝реЗрд╢рди рдкреНрд░рд╛рдЗрдореЗрдЯреАрдЬрд╝ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдкрдбрд╝рддрд╛ рд╣реИред .NET рд╕рдВрджрд░реНрдн рдореЗрдВ, рдЙрдирдореЗрдВ рд╕реЗ рдмрд╣реБрдд рд╕рд╛рд░реЗ рд╣реИрдВ, рдореИрдВ рдЙрдиреНрд╣реЗрдВ рд╕реВрдЪреАрдмрджреНрдз рдирд╣реАрдВ рдХрд░реВрдВрдЧрд╛,
рдПрдордПрд╕рдбреАрдПрди рдиреЗ рдкрд╣рд▓реЗ рд╣реА рдореЗрд░реЗ рд▓рд┐рдП рдпрд╣ рдХрд░ рджрд┐рдпрд╛ рд╣реИред
рдореБрдЭреЗ рдЗрдирдореЗрдВ рд╕реЗ рдХрдИ рдЖрджрд┐рдорддрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдкрдбрд╝рд╛, рдФрд░ рдЙрдиреНрд╣реЛрдВрдиреЗ рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдиреЗ рдореЗрдВ рдкреВрд░реА рдорджрдж рдХреАред рд▓реЗрдХрд┐рди рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдореИрдВ рдбреЗрд╕реНрдХрдЯреЙрдк рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рд╕рд╛рдорд╛рдиреНрдп рд▓реЙрдХ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдФрд░ рдирдпрд╛ (рдХрдо рд╕реЗ рдХрдо рдореЗрд░реЗ рд▓рд┐рдП) рдЖрджрд┐рдо рджрд┐рдЦрд╛рдИ рджрд┐рдпрд╛, рдЬрд┐рд╕реЗ рдкреНрд░рд╛рдпреЛрд░рд▓реЙрдХ рдХрд╣рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рд╕рдорд╕реНрдпрд╛
рдЕрддреНрдпрдзрд┐рдХ рд▓реЛрдб рд╡рд╛рд▓реЗ рдорд▓реНрдЯреАрдереНрд░реЗрдб рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдХреЛ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рддреЗ рд╕рдордп, рдПрдХ рдкреНрд░рдмрдВрдзрдХ рдХрд╣реАрдВ рди рдХрд╣реАрдВ рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рд╣реИ рдЬреЛ рдЕрдирдЧрд┐рдирдд рдереНрд░реЗрдбреНрд╕ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддрд╛ рд╣реИред рддреЛ рдпрд╣ рдореЗрд░реЗ рд╕рд╛рде рдерд╛ред рдФрд░ рдЗрд╕ рдкреНрд░рдмрдВрдзрдХ рдиреЗ рдХрдИ рд╕реИрдХрдбрд╝реЛрдВ рдереНрд░реЗрдбреНрд╕ рд╕реЗ рдЕрдиреБрд░реЛрдзрд┐рдд рдЯрди рдХреЛ рдХрд╛рдо рдХрд┐рдпрд╛ред рдФрд░ рдЙрд╕рдХреЗ рд╕рд╛рде рд╕рдм рдХреБрдЫ рдареАрдХ рдерд╛, рд▓реЗрдХрд┐рди рд╕рд╛рдорд╛рдиреНрдп рд▓реЙрдХ рдХреЗ рдЕрдВрджрд░ рдХрд╛рдо рдХрд┐рдпрд╛ред
рдФрд░ рдлрд┐рд░ рдПрдХ рджрд┐рди рдПрдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдореИрдВ) рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдореЗрдВ рдПрдХ рдмрдЯрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рддрд╛ рд╣реИ, рд╕реНрдЯреНрд░реАрдо рдкреНрд░рдмрдВрдзрдХ (рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдпреВрдЖрдИ рд╕реНрдЯреНрд░реАрдо рдирд╣реАрдВ) рдХреЗ рд▓рд┐рдП рдЙрдбрд╝рд╛рди рднрд░рддрд╛ рд╣реИ рдФрд░ рдПрдХ рд╕реБрдкрд░ рдлреНрд░реЗрдВрдбрд▓реА рд░рд┐рд╕реЗрдкреНрд╢рди рджреЗрдЦрдиреЗ рдХреА рдЙрдореНрдореАрдж рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рд╡рд╣ рд╕рдмрд╕реЗ рдШрдиреЗ рдХреНрд▓рд┐рдирд┐рдХ рдХреЗ рд╕рдмрд╕реЗ рдШрдиреЗ рд░рд┐рд╕реЗрдкреНрд╢рди рдбреЗрд╕реНрдХ рд╕реЗ рдЖрдВрдЯреА рдХреНрд▓рд╡рд╛ рд╕реЗ рдорд┐рд▓рддрд╛ рд╣реИ, рдЬреЛ рд╢рдмреНрджреЛрдВ рдХреЗ рд╕рд╛рде "рдореИрдВ рдПрдХ рд▓рд╛рдирдд рдирд╣реАрдВ рджреЗрддрд╛ред рдЖрдкрдХреЛ рдХрд┐рд╕рдиреЗ рдирд┐рд░реНрджреЗрд╢рд┐рдд рдХрд┐рдпрд╛ рдореЗрд░реЗ рдЖрдкрдХреЗ рдкрд╛рд╕ 950 рдФрд░ рд╣реИрдВред рдЬрд╛рдУ рдФрд░ рдЙрдирдХреЗ рдкрд╛рд╕ рдЬрд╛рдУред рдореБрдЭреЗ рдкрд░рд╡рд╛рд╣ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЖрдк рдЗрд╕реЗ рдХреИрд╕реЗ рд╕рдордЭрддреЗ рд╣реИрдВред " рдпрд╣ рд╣реИ рдХрд┐ .NET рдореЗрдВ рд▓реЙрдХ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдФрд░ рд╕рдм рдХреБрдЫ рдареАрдХ рд▓рдЧрддрд╛ рд╣реИ, рд╕рдм рдХреБрдЫ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рд▓реЗрдХрд┐рди рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдиреЗ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЕрдкрдиреА рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХреЗ рдЬрд╡рд╛рдм рдХреЗ рд▓рд┐рдП рдХреБрдЫ рд╕реЗрдХрдВрдб рдЗрдВрддрдЬрд╛рд░ рдХрд░рдиреЗ рдХреА рдпреЛрдЬрдирд╛ рдирд╣реАрдВ рдмрдирд╛рдИред
рдпрд╣реАрдВ рд╕реЗ рджрд┐рд▓ рдЯреВрдЯрдиреЗ рдХреА рдХрд╣рд╛рдиреА рдЦрддреНрдо рд╣реЛрддреА рд╣реИ рдФрд░ рддрдХрдиреАрдХреА рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рдорд╛рдзрд╛рди рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИред
рдирд┐рд░реНрдгрдп
рдорд╛рдирдХ рдЖрджрд┐рдо рдХрд╛ рдЕрдзреНрдпрдпрди рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдореБрдЭреЗ рдПрдХ рдЙрдкрдпреБрдХреНрдд рд╡рд┐рдХрд▓реНрдк рдирд╣реАрдВ рдорд┐рд▓рд╛ред рдЗрд╕рд▓рд┐рдП, рдореИрдВрдиреЗ рдЕрдкрдирд╛ рд▓реЙрдХ рд▓рд┐рдЦрдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛, рдЬрд┐рд╕рдореЗрдВ рдПрдХ рдорд╛рдирдХ рдФрд░ рдЙрдЪреНрдЪ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рд╡рд╛рд▓реА рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рд╣реЛрдЧреАред рд╡реИрд╕реЗ, рд▓рд┐рдЦрдиреЗ рдХреЗ рдмрд╛рдж, рдореИрдВрдиреЗ рдирдЧреЗрдЯ рдХрд╛ рдЕрдзреНрдпрдпрди рдХрд┐рдпрд╛, рдЗрд╕рд▓рд┐рдП, рдореБрдЭреЗ рд╡рд╣рд╛рдБ рдРрд╕рд╛ рдХреБрдЫ рднреА рдирд╣реАрдВ рдорд┐рд▓рд╛, рд╣рд╛рд▓рд╛рдБрдХрд┐ рдореБрдЭреЗ рд╢рд╛рдпрдж рд╣реА рдкрддрд╛ рдЪрд▓рд╛ рд╣реЛред
рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рдЖрджрд┐рдо (рдпрд╛ рдЕрдм рдПрдХ рдЖрджрд┐рдо) рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП, рдореБрдЭреЗ SemaphoreSlim, SpinWait, рдФрд░ рдЗрдВрдЯрд░рд▓рд╛рдХ рд╕рдВрдЪрд╛рд▓рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереАред рд╕реНрдкреЙрдЗрд▓рд░ рдореЗрдВ, рдореИрдВрдиреЗ рдЕрдкрдиреЗ рдкреНрд░рд╛рдпреЛрд░рд▓реЙрдХ (рдХреЗрд╡рд▓ рд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдХреЛрдб, рд▓реЗрдХрд┐рди рдпрд╣ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ) рдХреЗ рдкрд╣рд▓реЗ рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рд╣рд╡рд╛рд▓рд╛ рджрд┐рдпрд╛ рдФрд░ рдЗрд╕рдХреЗ рд▓рд┐рдП рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рджрд┐рдпрд╛ред
рдЫрд┐рдкрд╛ рд╣реБрдЖ рдкрд╛рдард╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ, рдХреЛрдИ рдЦреЛрдЬ рдирд╣реАрдВ рд╣реИ, рдЬрдмрдХрд┐ рдХреЛрдИ рд▓реЙрдХ рдореЗрдВ рд╣реИ, рдЕрдиреНрдп рдкреНрд░рд╡реЗрд╢ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрджрд┐ рдПрдХ рдЙрдЪреНрдЪ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рдЖ рдЧрдИ рд╣реИ, рддреЛ рдпрд╣ рдЙрди рд╕рднреА рд▓реЛрдЧреЛрдВ рджреНрд╡рд╛рд░рд╛ рдЖрдЧреЗ рдмрдврд╝рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬреЛ рдХрдо рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВред
LockMgr рд╡рд░реНрдЧ, рдЖрдкрдХреЗ рдХреЛрдб рдореЗрдВ рдЗрд╕рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рд╣реИред рдпрд╣ рд╡рд╣ рд╣реИ рдЬреЛ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди рдХрд╛ рдмрд╣реБрдд рдЙрджреНрджреЗрд╢реНрдп рд╣реИред рд▓реЙрдХрд░ рдФрд░ рд╣рд╛рдИрд▓реЙрдХрд░ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдмрдирд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рд╕реЗрдорд╛рдлреЛрд░рд╕, рд╕реНрдкрд┐рдирд╡рд╛рдЗрдЯреНрд╕, рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЕрдиреБрднрд╛рдЧ рдореЗрдВ рдЖрдиреЗ рдХреЗ рдЗрдЪреНрдЫреБрдХ рдХрд╛рдЙрдВрдЯрд░, рд╡рд░реНрддрдорд╛рди рдереНрд░реЗрдб рдФрд░ рд░рд┐рдХрд░реНрд╕рди рдХрд╛рдЙрдВрдЯрд░ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред
public class LockMgr { internal int HighCount; internal int LowCount; internal Thread CurThread; internal int RecursionCount; internal readonly SemaphoreSlim Low = new SemaphoreSlim(1); internal readonly SemaphoreSlim High = new SemaphoreSlim(1); internal SpinWait LowSpin = new SpinWait(); internal SpinWait HighSpin = new SpinWait(); public Locker HighLock() { return new HighLocker(this); } public Locker Lock(bool high = false) { return new Locker(this, high); } }
рд▓реЙрдХрд░ рд╡рд░реНрдЧ рдЖрдИрдбреАрд╕реЛрдлрд╛рдЗрд▓ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред рд▓реЙрдХ рдХреЛ рдХреИрдкреНрдЪрд░ рдХрд░рддреЗ рд╕рдордп рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рд╕реНрдЯреНрд░реАрдо рдХреА рдЖрдИрдбреА рдХреЛ рдпрд╛рдж рдХрд░рддреЗ рд╣реИрдВ, рдлрд┐рд░ рдЗрд╕реЗ рдЬрд╛рдВрдЪреЗрдВред рдЖрдЧреЗ, рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рдЙрдЪреНрдЪ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдо рддреБрд░рдВрдд рдХрд╣рддреЗ рд╣реИрдВ рдХрд┐ рд╣рдо рдЖрдП (рд╣рд╛рдИрдХрд╛рдЙрдВрдЯ рдХрд╛рдЙрдВрдЯрд░ рдмрдврд╝рд╛рдПрдВ), рдЙрдЪреНрдЪ рд╕реЗрдореАрдлреЛрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ, рдФрд░ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░реЗрдВ (рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ) рддрд╛рд▓рд╛ рдХреЛ рдХрдо рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рд╕реЗ рдЬрд╛рд░реА рдХрд░реЗрдВ, рдЬрд┐рд╕рдХреЗ рдмрд╛рдж рд╣рдо рд▓реЙрдХ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реИрдВред рдХрдо рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдХрдо рдЕрд░реНрдз-рдкреНрд░рд╛рдкреНрдд рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рдлрд┐рд░ рд╣рдо рд╕рднреА рдЙрдЪреНрдЪ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рдкреНрд░рд╡рд╛рд╣ рдХреЗ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░, рдереЛрдбрд╝реА рджреЗрд░ рдХреЗ рд▓рд┐рдП рдЙрдЪреНрдЪ рдЕрд░реНрдз-рд╕рдВрд╕реНрдХрд░рдг рд▓реЗрддреЗ рд╣реБрдП, LowCount рдмрдврд╝рд╛рддреЗ рд╣реИрдВред
рдпрд╣ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ рд╣рд╛рдИрдХрд╛рдЙрдВрдЯ рдФрд░ рд▓реЛрд╡рд╛рдЙрдВрдЯ рдХрд╛ рдЕрд░реНрде рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╣реИ, рд╣рд╛рдИрдХрд╛рдЙрдВрдЯ рдореЗрдВ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рд╡рд╛рд▓реЗ рдереНрд░реЗрдбреНрд╕ рдХреА рд╕рдВрдЦреНрдпрд╛ рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛрддреА рд╣реИ рдЬреЛ рд▓реЙрдХ рдореЗрдВ рдЖрдП, рдЬрдм рд▓реЙрдХрд╛рдЙрдВрдЯ рдХрд╛ рдорддрд▓рдм рд╕рд┐рд░реНрдл рдпрд╣ рд╣реИ рдХрд┐ рдХрдо рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рд╡рд╛рд▓рд╛ рдереНрд░реЗрдб (рдПрдХ рд╕рд┐рдВрдЧрд▓) рд▓реЙрдХ рдореЗрдВ рдЪрд▓рд╛ рдЧрдпрд╛ред
public class Locker : IDisposable { private readonly bool _isHigh; private LockMgr _mgr; public Locker(LockMgr mgr, bool isHigh = false) { _isHigh = isHigh; _mgr = mgr; if (mgr.CurThread == Thread.CurrentThread) { mgr.RecursionCount++; return; } if (_isHigh) { Interlocked.Increment(ref mgr.HighCount); mgr.High.Wait(); while (Interlocked.CompareExchange(ref mgr.LowCount, 0, 0) != 0) mgr.HighSpin.SpinOnce(); } else { mgr.Low.Wait(); while (Interlocked.CompareExchange(ref mgr.HighCount, 0, 0) != 0) mgr.LowSpin.SpinOnce(); try { mgr.High.Wait(); Interlocked.Increment(ref mgr.LowCount); } finally { mgr.High.Release(); } } mgr.CurThread = Thread.CurrentThread; } public void Dispose() { if (_mgr.RecursionCount > 0) { _mgr.RecursionCount--; _mgr = null; return; } _mgr.RecursionCount = 0; _mgr.CurThread = null; if (_isHigh) { _mgr.High.Release(); Interlocked.Decrement(ref _mgr.HighCount); } else { _mgr.Low.Release(); Interlocked.Decrement(ref _mgr.LowCount); } _mgr = null; } } public class HighLocker : Locker { public HighLocker(LockMgr mgr) : base(mgr, true) { } }
LockMgr рдХреНрд▓рд╛рд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдмрд╣реБрдд рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдерд╛ред рдЙрджрд╛рд╣рд░рдг рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЕрдиреБрднрд╛рдЧ рдХреЗ рдЕрдВрджрд░ _lockMgr рдХреЗ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдХреЛ рджрд░реНрд╢рд╛рддрд╛ рд╣реИ, рдЬрдмрдХрд┐ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рдЕрдм рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реИред
private PriorityLock.LockMgr _lockMgr = new PriorityLock.LockMgr(); public void LowPriority() { using (_lockMgr.Lock()) { using (_lockMgr.HighLock()) {
рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдЕрдкрдиреА рд╕рдорд╕реНрдпрд╛ рд╣рд▓ рдХрд░ рд▓реАред рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХрд╛рд░реНрд░рд╡рд╛рдИ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдирд╛ рдЙрдЪреНрдЪ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рдХреЗ рд╕рд╛рде рдкреНрд░рджрд░реНрд╢рди рдХрд┐рдпрд╛ рдЬрд╛рдиреЗ рд▓рдЧрд╛, рдХрд┐рд╕реА рдХреЛ рдЪреЛрдЯ рдирд╣реАрдВ рдкрд╣реБрдВрдЪреА, рд╣рд░ рдХреЛрдИ рдЬреАрдд рдЧрдпрд╛ред
asynchrony
рдЪреВрдВрдХрд┐ рд╕реЗрдордлреЛрд░рд╕реНрд▓реАрдо рд╡рд░реНрдЧ рдХреА рд╡рд╕реНрддреБрдПрдВ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддреА рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдЗрд╕ рдЕрд╡рд╕рд░ рдХреЛ рднреА рдЕрдкрдиреЗ рд╕рд╛рде рдЬреЛрдбрд╝рд╛ред рдХреЛрдб рдиреНрдпреВрдирддрдо рд░реВрдк рд╕реЗ рднрд┐рдиреНрди рд╣реЛрддрд╛ рд╣реИ рдФрд░ рд▓реЗрдЦ рдХреЗ рдЕрдВрдд рдореЗрдВ рдореИрдВ рд╕реНрд░реЛрдд рдХреЛрдб рдХрд╛ рд▓рд┐рдВрдХ рдкреНрд░рджрд╛рди рдХрд░реВрдВрдЧрд╛ред
рдпрд╣рд╛рдВ рдпрд╣ рдзреНрдпрд╛рди рд░рдЦрдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ рдЯрд╛рд╕реНрдХ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдзрд╛рдЧреЗ рд╕реЗ рдЬреБрдбрд╝рд╛ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП, рд▓реЙрдХ рдХреЗ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХреЛ рдПрдХ рд╕рдорд╛рди рддрд░реАрдХреЗ рд╕реЗ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, MSDN рджреНрд╡рд╛рд░рд╛ рдмрддрд╛рдИ рдЧрдИ
рдЯрд╛рд╕реНрдХ ред
CurrentId рд╕рдВрдкрддреНрддрд┐ рдХреБрдЫ рднреА рдЧрд╛рд░рдВрдЯреА рдирд╣реАрдВ рджреЗрддреА рд╣реИред рдпрд╣реАрдВ рд╕реЗ рдореЗрд░реЗ рд╡рд┐рдХрд▓реНрдк рд╕рдорд╛рдкреНрдд рд╣реБрдПред
рд╕рдорд╛рдзрд╛рди рдХреА рддрд▓рд╛рд╢ рдореЗрдВ, рдореИрдВ
NeoSmart.AsyncLock рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рдкрд╛рд░ рдЖрдпрд╛, рдЬрд┐рд╕рдХреЗ рд╡рд┐рд╡рд░рдг рдореЗрдВ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд▓реЙрдХ рдХрд╛ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдХрд╛ рд╕рдВрдХреЗрдд рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рддрдХрдиреАрдХреА рд░реВрдк рд╕реЗ, рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ рддрд╛рд▓рд╛ рдЕрдкрдиреЗ рдЖрдк рдореЗрдВ рддрд╛рд▓рд╛ рдирд╣реАрдВ рд╣реИред рдпрджрд┐ рдЖрдк рдЗрд╕ рдкреИрдХреЗрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╕рд╛рд╡рдзрд╛рди рд░рд╣реЗрдВ рдХрд┐ рдпрд╣ рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ!
рдирд┐рд╖реНрдХрд░реНрд╖
рдкрд░рд┐рдгрд╛рдо рдПрдХ рд╡рд░реНрдЧ рд╣реИ рдЬреЛ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХреЗ рд╕рд╛рде рддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╕рдВрдЪрд╛рд▓рди рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХреЗ рдмрд┐рдирд╛ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╕рдВрдЪрд╛рд▓рдиред рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдФрд░ рд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдСрдкрд░реЗрд╢рдиреНрд╕ рдХреЛ рдПрдХ рд╕рд╛рде рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ рд╕рд╛рде рдЗрд╕реНрддреЗрдорд╛рд▓ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ! рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╡рд┐рдХрд▓реНрдк рдХреЗ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдХреА рдХрдореА рдХреЗ рдХрд╛рд░рдг рд╕рднреАред
рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдореИрдВ рдРрд╕реА рд╕рдорд╕реНрдпрд╛рдУрдВ рдореЗрдВ рдЕрдХреЗрд▓рд╛ рдирд╣реАрдВ рд╣реВрдВ рдФрд░ рдореЗрд░рд╛ рд╕рдорд╛рдзрд╛рди рдХрд┐рд╕реА рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛ред рдореИрдВрдиреЗ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЛ рдЧрд┐рддреВрдм рдФрд░ рдирдЧреЗрдЯ рдкрд░ рдкреЛрд╕реНрдЯ рдХрд┐рдпрд╛ред
рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдореЗрдВ рдРрд╕реЗ рдкрд░реАрдХреНрд╖рдг рд╣реЛрддреЗ рд╣реИрдВ рдЬреЛ рдкреНрд░рд╛рдпрд░рд┐рдЯреАрд▓реЙрдХ рдХреЗ рд╕реНрд╡рд╛рд╕реНрдереНрдп рдХреЛ рджрд░реНрд╢рд╛рддреЗ рд╣реИрдВред рдЗрд╕ рдкрд░реАрдХреНрд╖рдг рдХреЗ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рднрд╛рдЧ рдкрд░, NeoSmart.AsyncLock рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдФрд░ рдкрд░реАрдХреНрд╖рдг рд╡рд┐рдлрд▓ рд╣реЛ рдЧрдпрд╛ред
рдирдЧреЗрдЯ рд╕реЗ рд▓рд┐рдВрдХ рдХрд░реЗрдВрдЬреАрдердм рд▓рд┐рдВрдХ