
рдореИрдВрдиреЗ рдмрд╛рд░-рдмрд╛рд░ рдпрд╣ рдХрдерди рд╕реБрдирд╛ рд╣реИ рдХрд┐ рдХрд┐рд╕реА рдЪреАрдЬрд╝ рдХреЛ рдмрдирд╛рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдПрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛ рдХрд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рдЕрдзреНрдпрдпрди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдореИрдВ рдЗрд╕рд╕реЗ рдЕрд╕рд╣рдордд рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рдерд╛, рдФрд░ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ рдХрд┐ рдпрд╣ рди рдХреЗрд╡рд▓ рднрд╛рд╖рд╛ рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИ, рдмрд▓реНрдХрд┐ рдЗрд╕ рднрд╛рд╖рд╛ рдХреЗ рд╕рд╛рде рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреА рдкреНрд░реМрджреНрдпреЛрдЧрд┐рдХрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рднреА рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИред
рдПрдХ рдЕрдЬреНрдЮрд╛рдд рдЯреНрд░реИрдХ рдХреЛ рдЪрд▓рд╛рдирд╛ рдЖрдкрдХреЗ рд▓рд┐рдП рдЖрд╕рд╛рди рдирд╣реАрдВ рд╣реИ, рдпрд╣ рд╕реАрдЦрдирд╛ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИ рдХрд┐ рдХреЛрдИ рдЖрдкрдХреЗ рд╕рд╛рдордиреЗ рдЗрд╕ рдЯреНрд░реИрдХ рдХреЛ рдХреИрд╕реЗ рдЪрд▓рд╛ рд░рд╣рд╛ рд╣реИред рдореБрдЭреЗ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рдХрд╛ рдЕрдзреНрдпрдпрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЖрддреНрдорд╛ рдирд╣реАрдВ рд╣реИ, рдореИрдВ рдЗрд╕реЗ рд╕рдВрджрд░реНрдн рдкреБрд╕реНрддрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ, рдФрд░ рдЦрд░реЛрдВрдЪ рд╕реЗ рдХреБрдЫ рдХрд╛ рдЕрдзреНрдпрдпрди рдХрд░рдиреЗ рдореЗрдВ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╕рдордп рдФрд░ рдкреНрд░рдпрд╛рд╕ рд▓рдЧрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЖрдорддреМрд░ рдкрд░ рд▓реЗрдЦрдХ рдпрд╣ рдорд╛рди рд▓реЗрддреЗ рд╣реИрдВ рдХрд┐ рдкрд╛рдардХ рдХреЗ рдкрд╛рд╕ рдЕрдзрд┐рдХ рдЬреНрдЮрд╛рди рд╣реИ, рдЙрд╕реЗ рд▓рдЧрднрдЧ рд╡рд╣ рд╕рдм рдХреБрдЫ рдкрддрд╛ рд╣реИ рдЬрд┐рд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд╕рд╛рдЗрдХрд┐рд▓ рдЪрд▓рд╛рдиреЗ рдХреЗ рд╡рд┐рд╖рдп рднреА рд╕реАрдЦрдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдХрд╡рд░ рдХрд░рддреЗ рд╣реИрдВ, рд░реЗрдХ рдФрд░ рдмрд╛рдХреА рд╕рдм рдХреБрдЫ рдЪрд▓рддреЗ рд╣реИрдВред рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдореБрдЭреЗ рдореЗрд░реЗ рд╣рд┐рдд рдХреЗ рд╡рд┐рд╖рдпреЛрдВ рдкрд░ рдкрд░реНрдпрд╛рдкреНрдд рд╡рд┐рд╕реНрддреГрдд рд▓реЗрдЦ рдирд╣реАрдВ рдорд┐рд▓реЗ, рдлрд┐рдЯ рдФрд░ рд╢реБрд░реВ рдореЗрдВ рдЕрдзреНрдпрдпрди рдХрд┐рдпрд╛, рдФрд░ рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рдЬреАрд╡рди рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдиреЗ рдХреА рдЙрдореНрдореАрдж рдореЗрдВ, рдЦреБрдж рд▓реЗрдЦ рд▓рд┐рдЦрдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛, рдЬреЛ рдЕрдиреБрд╕рд░рдг рдХрд░ рд╕рдХрддреЗ рдереЗред
рдпрджрд┐ рдЖрдк рдЪрд╛рд╣реЗрдВ, рддреЛ рдореБрдЭреЗ рдЯреАрдбреАрдбреА, рдЙрд░реНрдл тАЛтАЛрдЯреЗрд╕реНрдЯ-рдбреНрд░рд┐рд╡реЗрди рдбреЗрд╡рд▓рдкрдореЗрдВрдЯ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдПрдХ рд╕рд╣рд╛рдпрдХ рддрдХрдиреАрдХ рдХреЗ рд░реВрдк рдореЗрдВ, рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рднрд╛рдЧ рдореЗрдВ, Moq рдкрд░реАрдХреНрд╖рдг рдврд╛рдВрдЪреЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдЖрдЧреЗ рджреЗрдЦрддреЗ рд╣реБрдП, рдореИрдВ рдХрд╣реВрдВрдЧрд╛ рдХрд┐ рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдирд╛ рд╕рдВрднрд╡ рдирд╣реАрдВ рдерд╛, рдХреНрдпреЛрдВрдХрд┐ рдореБрдЭреЗ "рд╡рд╛рд╕реНрддреБрдХрд╛рд░" рдХреЗ рд░реВрдк рдореЗрдВ рдЕрдиреБрднрд╡ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдореБрдЭреЗ рдХреБрдЫ рдмреНрд▓реЙрдХреЛрдВ рдХреЛ рдлрд┐рд░ рд╕реЗ рдХрд░рдирд╛ рдкрдбрд╝рд╛, рдФрд░ рдкрд░реАрдХреНрд╖рдг рдХреЗ рдорд╛рдорд▓реЗ рдЦреБрдж, рдЬреЛ рдореИрдВрдиреЗ рд▓рд┐рдЦрд╛ рдерд╛, рдЕрднреА рддрдХ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдкрддрд╛ рдирд╣реАрдВ рдерд╛ рдХрд┐ рдХрдХреНрд╖рд╛ рдХреЛ рдХреНрдпрд╛ рдФрд░ рдХреИрд╕реЗ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЪреАрдЬреЗрдВ рдЖрдЧреЗ рдмрдврд╝реА рд╣реИрдВ, рдЕрдиреБрднрд╡ рдкреНрд░рд╛рдкреНрдд рд╣реБрдЖ рд╣реИ, рдФрд░ рдЕрдЧрд▓реА рдмрд╛рд░ рдпрд╣ рдЖрд╕рд╛рди рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рджреВрд╕рд░реА рддрдХрдиреАрдХ, рдЬрд┐рд╕реЗ рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдорд╛рд╕реНрдЯрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рд╛рдереЛрдВ рд╕реЗ рдЦрд░реЛрдВрдЪ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдирд┐рд░реНрднрд░рддрд╛ рдФрд░ рдЖрдИрдУрд╕реА рдХрдВрдЯреЗрдирд░реЛрдВ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИред рд╡рд┐рдХрд╛рд╕ рдореЗрдВ, рдореИрдВрдиреЗ рд╕рдмрд╕реЗ рдкреНрд░рднрд╛рд╡рд╢рд╛рд▓реА рдСрдЯреЛрдлреЗрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ред
рд╕рд╛рдЗрдХрд┐рд▓ рдЪрд▓рд╛рдиреЗ рдХрд╛ рдереАрдо
рдореБрдЭреЗ рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдЪрдпрди рдирд╣реАрдВ рдХрд░рдирд╛ рдкрдбрд╝рд╛, рд╕рдорд╛рдзрд╛рди рдХрд╛ рд╢рд╛рдмреНрджрд┐рдХ рдЕрд░реНрде рдЕрдкрдиреЗ рдЖрдк рдЖ рдЧрдпрд╛ - рдлрд╝рд┐рд▓реНрдЯрд░рд┐рдВрдЧ рдФрд░ рдПрдХ рд╡рд┐рдиреНрдпрд╛рд╕ рдпреЛрдЧреНрдп рдЖрдЙрдЯрдкреБрдЯ рдкреНрд░рд╛рд░реВрдк рдХреЗ рд╕рд╛рде рдЕрдкрдирд╛ рд╕реНрд╡рдпрдВ рдХрд╛ рд▓рдХрдбрд╝рд╣рд╛рд░рд╛ рд▓рд┐рдЦрдирд╛ред рдореИрдВ ASP.Net, рдФрд░ MVC3 рдврд╛рдВрдЪреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдкрдирд╛ рдкрд╣рд▓рд╛ рд▓реЗрдЦ рд▓рд┐рдЦрдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЕрдм рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА MVC4 рдХреА рдУрд░ рдмрдврд╝рдиреЗ рдХрд╛ рдорддрд▓рдм рд╣реИред рдкреНрд░реМрджреНрдпреЛрдЧрд┐рдХрд┐рдпреЛрдВ рдХреЗ рдмреАрдЪ, рд╡реИрд╕реЗ, рдпрд╣ рдПрдВрдЯрд┐рдЯреА рдлреНрд░реЗрдорд╡рд░реНрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдерд╛ред рдЗрд╕ рд╡рд┐рд╖рдп рдкрд░ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рд▓реЗрдЦ рд╣реИ, рд▓реЗрдХрд┐рди рд▓реЗрдЦрдХ рд╡рд╛рджрд╛ рдкреВрд░рд╛ рдХрд┐рдП рдмрд┐рдирд╛ рдЧрд╛рдпрдм рд╣реЛ рдЧрдпрд╛ред
рддреЛ рдореИрдВ рдПрдХ рд▓рдХрдбрд╝рд╣рд╛рд░реЗ рд╕реЗ рдХреНрдпреЛрдВ рдмрд╛рдзрд┐рдд рд╣реВрдВ? рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЙрд╕ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдмрдирд╛рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ, рд▓реЙрдЧрд┐рдВрдЧ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдЙрддреНрдкрдиреНрди рд╣реБрдИред рдореБрдЭреЗ NLG рдореЗрдВ рдЙрдкрд▓рдмреНрдз NLog рд▓реЗрдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреА рдЧрдИ рдереА, рд▓реЗрдХрд┐рди рдЗрд╕рдХрд╛ рдЕрдзреНрдпрдпрди рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдореИрдВ рдЗрд╕ рдирд┐рд╖реНрдХрд░реНрд╖ рдкрд░ рдкрд╣реБрдВрдЪрд╛ рдХрд┐ рдореЗрд░рд╛ рд▓рдХрдбрд╝рд╣рд╛рд░рд╛ рд▓рд┐рдЦрдирд╛ рди рдХреЗрд╡рд▓ рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ, рдмрд▓реНрдХрд┐ рдЙрдЪрд┐рдд рднреА рд╣реИред рдореИрдВрдиреЗ рдЦреБрдж рдЗрд╕рдХреА рдЬрд╛рдВрдЪ рдирд╣реАрдВ рдХреА, рд▓реЗрдХрд┐рди рдЗрдВрдЯрд░рдиреЗрдЯ рдкрд░ рд╕рдореАрдХреНрд╖рд╛рдУрдВ рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП, log4net рдЗрд╕рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдзреАрдорд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдЗрд╕ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВ рдХрд┐рдпрд╛ред
рдореИрдВ рдЦреБрдж рдЯреЗрд▓реАрдХреЙрдо рдореЗрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реВрдВ, рдФрд░ рдореБрдЭреЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд▓рдХрдбрд╝рд╣рд╛рд░реЗ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рдкрдбрд╝рддрд╛ рдерд╛, рдЬрдм рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереА рдЬреЛ рдорд╛рдирдХ syslogs рдореЗрдВ рдЕрдиреБрдкрд╕реНрдерд┐рдд рдерд╛ред рдпрд╣ рдЖрдИрдбреА рджреНрд╡рд╛рд░рд╛ рдлрд╝рд┐рд▓реНрдЯрд░рд┐рдВрдЧ рд╣реИред рдЬрдм рдХреЛрдИ рд╕рд╛рдЗрдЯ рдкреНрд░рддрд┐ рдШрдВрдЯреЗ 30 рд╣рдЬрд╛рд░ рдХреЙрд▓ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд░рддреА рд╣реИ, рддреЛ рднрд▓реЗ рд╣реА рдЙрд╕ рдкрд░ рдмрдЧ рдХрд╛ 100% рдкреБрдирд░реБрддреНрдкрд╛рджрди рд╣реЛ, рд▓реЗрдХрд┐рди рдореЗрдЧрд╛рдмрд╛рдЗрдЯ рдореЗрдВ рдЙрд╕реЗ рдЦреЛрдЬрдирд╛ рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рд▓реЙрдЧ рдХреА рдЧреАрдЧрд╛рдмрд╛рдЗрдЯ рднреА рдЗрддрдирд╛ рд╕рд░рд▓ рдирд╣реАрдВ рд╣реИред рд╣рд╛рдВ, рдФрд░ рд╕рднреА рд╕рд┐рд╕реНрдЯрдо рдЖрдкрдХреЛ рд▓реЙрдЧ рдХреА рдЧреАрдЧрд╛рдмрд╛рдЗрдЯ рд╕реНрдЯреЛрд░ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрддреЗ рд╣реИрдВ, рдХреБрдЫ рд╕реНрдерд╛рдиреЛрдВ рдкрд░ рдРрд╕реЗ рд╕рд┐рд╕реНрдЯрдо рд╣реИрдВ рдЬреЛ рдХреЗрд╡рд▓ рдХреБрдЫ рдШрдВрдЯреЛрдВ рдХрд╛ рдЯреНрд░реИрдлрд╝рд┐рдХ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдХреЙрд▓ рд╕реНрд╡рдпрдВ рд▓рдВрдмреЗ рд╕рдордп рддрдХ рд╣реЛ рд╕рдХрддреА рд╣реИ, рдЕрд░реНрдерд╛рдд рдХреЙрд▓ рдХреА рд╢реБрд░реБрдЖрдд рдпрд╛ рдЕрдВрдд рд▓реЙрдЧ рдореЗрдВ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, "рдКрдкрд░ рд╕реЗ" рд╡рд┐рдЪрд╛рд░ рдЖрдпрд╛ - рдХреЙрд▓ рдХреЛ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░рдХреЗ рд╕рд╣реА рдмрд╛рдд рдХреЛ рдЙрдЬрд╛рдЧрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддрд╛рдХрд┐ рдХреЗрд╡рд▓ рд╡рд╣ рд▓реЙрдЧ рдореЗрдВ рд╣реЛ рдЬрд╛рдПред рдЦреИрд░, рдпрд╛ рдХреБрдЫ рдХреЙрд▓, рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рдЙрд╕ рд╕рдВрдЦреНрдпрд╛ рдкрд░ рдЬрд╣рд╛рдВ рдпрд╣ рдмрдЧ рд╕рдордп-рд╕рдордп рдкрд░ рд╣реЛрддрд╛ рд╣реИред рд╕рд┐рд╕рд▓реЙрдЧ рдХреЛ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдореИрдХреНрд░реЛ рджреНрд╡рд╛рд░рд╛ рдмрджрд▓ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдЬреЛ рдСрдкрд░реЗрдЯрд░ рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛рдУрдВ рдХреА рд╕реВрдЪреА рдХреЗ рд╕рд╛рде рд╕рддреНрд░ рдореЗрдВ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдХреА рддреБрд▓рдирд╛ рдХрд░рддрд╛ рд╣реИред рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдЯрд░реНрдорд┐рдирд▓ рдХреЗ рдЕрдиреВрдареЗ рдкрддреЗ рдФрд░ рдбрд╛рдпрд▓ рдХрд┐рдП рдЧрдП рдирдВрдмрд░ рджреЛрдиреЛрдВ рд╕реЗ рдмрдВрдзрд╛ рд╣реБрдЖ рдерд╛ред рдореЗрд░реЗ ASP.Net рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдореЗрдВ, рдлрд╝рд┐рд▓реНрдЯрд░рд┐рдВрдЧ рдХреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рджреНрд╡рд╛рд░рд╛ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рдерд╛ред рдмреЗрд╢рдХ, рдпрд╣ рдпрд╣рд╛рдБ рдмрд╣реБрдд рдЙрдЪрд┐рдд рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЬрдм рд╕реЗ рдореИрдВрдиреЗ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ рдХрд┐ рд▓рдХрдбрд╝рд╣рд╛рд░реЗ рдХреЛ рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдРрд╕рд╛ рд╣реА рд╣реЛред
рджреВрд╕рд░рд╛ рдмрд╛рдЗрдХ рдЕрд╡рд╕рд░ рдореБрдЭреЗ NLog рдХреЗ рд▓рд┐рдП рд╕реНрд░реЛрдд рдХреЛрдб рдХрд╛ рдЕрдзреНрдпрдпрди рдХрд░рдХреЗ рдорд┐рд▓рд╛ред рдЗрд╕рдореЗрдВ, рдХреЙрд▓рд┐рдВрдЧ рдереНрд░реЗрдб рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рд▓рдЧрднрдЧ рд╕рднреА рдХреНрд░рд┐рдпрд╛рдПрдВ рдХреА рдЬрд╛рддреА рд╣реИрдВ, рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд░реВрдк рд╕реЗ рдХреЗрд╡рд▓ рд╕реАрдзреЗ рд▓реЗрдЦрди рдХреЛ рд▓рдХреНрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╡рд╣, рдЬрд┐рд╕реЗ рдореИрдВ рдмрд╛рдж рдореЗрдВ рдЖрд╢реНрд╡рд╕реНрдд рд╣реЛ рдЧрдпрд╛, рдкреНрд░рджрд░реНрд╢рди рдХреЗ рд▓рд┐рдП рдХрд╛рдлреА рдиреБрдХрд╕рд╛рди рдХрд░рддрд╛ рд╣реИред
рдПрдХ рдЕрд▓рдЧ рдзрд╛рдЧреЗ рдкрд░ рд╕рдВрдЪрд╛рд▓рди рдбрд╛рд▓ рд░рд╣рд╛ рд╣реИ
рдореИрдВрдиреЗ рддреБрд░рдВрдд рдПрдХ рдЕрд▓рдЧ рд╡рд░реНрдЧ рдореЗрдВ рдЗрд╕ рдСрдкрд░реЗрд╢рди рдХрд╛ рдПрдирдХрд╛рдЙрдВрдЯрд░ рдХрд░ рджрд┐рдпрд╛ред рдХрдХреНрд╖рд╛ рдПрдХ рд╕реНрдЯреНрд░реАрдо рд╢реБрд░реВ рдХрд░реЗрдЧреА рдЬрд┐рд╕рдореЗрдВ рд╕рднреА рд╕рдВрджреЗрд╢реЛрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдФрд░ рдЗрди рд╕рдВрджреЗрд╢реЛрдВ рдХреЛ рдЗрд╕ рд╕реНрдЯреНрд░реАрдо рдореЗрдВ рднреЗрдЬрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ред рд╕рдВрджреЗрд╢ рдореЗрдВ рд▓реЙрдЧ, рд╕реНрддрд░ рдФрд░ рдЕрдиреНрдп рдЬрд╛рдирдХрд╛рд░реА рдХрд╛ рдкрд╛рда рд╣реЛрдЧрд╛ред рдпрд╣ рдХрд╛рд░реНрдп рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИ - рд▓реЙрдЧ рднреЗрдЬрдиреЗ рд╡рд╛рд▓реЗ рдереНрд░реЗрдб рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдХрд╛рд░реНрдпреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред
рдПрдХ рдЖрдзрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ, рдореИрдВрдиреЗ рдереНрд░реЗрдбрд╕рд┐рдВрдХ рдХрд╛ рдЙрджрд╛рд╣рд░рдг рд▓рд┐рдпрд╛ рд╣реИ рдЬреЛ рднрд╛рд╖рд╛ рдирдореВрдиреЗ рд╕реЗ рджреГрд╢реНрдп рд╕реНрдЯреВрдбрд┐рдпреЛ рдХреЗ рд╕рд╛рде рд╢рд╛рдорд┐рд▓ рд╣реИрдВред рдкреНрд░рдердо рд╢реНрд░реЗрдгреА рдЗрдВрдЯрд░рдлрд╝реЗрд╕:
public delegate void ReceiveHandler<T>(T item); public interface IQueued<T> { event ReceiveHandler<T> OnReceive; event Action OnTimeout; bool Active { get; } void setTimeout(int timeout); void Send(T msg); void Terminate(); }
рдзреНрд╡рдЬ рдереНрд░реЗрдбрд░реБрди рдЖрдВрддрд░рд┐рдХ рд╡рд┐рдзрд┐ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рдЕрдВрдд рдореЗрдВ рд░реАрд╕реЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред OnReceive рдЗрд╡реЗрдВрдЯ рддрдм рд╣реЛрддрд╛ рд╣реИ рдЬрдм рдПрдХ рд╕реНрдЯреНрд░реАрдо рдХреЛ рдПрдХ рдирдпрд╛ рд╕рдВрджреЗрд╢ рдорд┐рд▓рд╛ рд╣реИред рддрд░реНрдХ рдкреНрд░рдХрд╛рд░ рдХреА рдХрд╛рд╕реНрдЯрд┐рдВрдЧ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдИрд╡реЗрдВрдЯ рдкреНрд░рддрд┐рдирд┐рдзрд┐ рдкреНрд░рдХрд╛рд░ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ред рд╕реАрдзреЗ рдбрд┐рд╕реНрдХ рдкрд░ рдирд╣реАрдВ рд▓рд┐рдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдЯрд╛рдЗрдордЖрдЙрдЯ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛, рд▓реЗрдХрд┐рди рдкрд╣рд▓реЗ рдмрдлрд░ рдХреЗ рд▓рд┐рдП, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╕реНрдЯреНрд░рд┐рдВрдЧрдмрд░реНрд▓рд╕реНрдЯ рдореЗрдВред рдЕрдВрддрд┐рдо рд╕рдВрджреЗрд╢ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╕рдордп рдХреЗ рдмрд╛рдж, рдСрдирдЯрд╛рдЗрдордЖрдЙрдЯ рдШрдЯрдирд╛ рдХреЛ рдПрдХ рдмрд╛рд░ рдЯреНрд░рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рддрд╛рдХрд┐ рдЕрдВрддрд┐рдо рдкреНрд░рд╛рдкреНрдд рд▓реЙрдЧ рдбрд┐рд╕реНрдХ рдкрд░ рдЬрд╛рдиреЗ рдХреА рдЧрд╛рд░рдВрдЯреА рд╣реЛред
рдХрдХреНрд╖рд╛ рдореЗрдВ рджреЛ рд╡рд┐рдХрд▓реНрдк рд╣реИрдВ, рдЖрдк рдХрд┐рд╕реА рднреА рдХрд╛рд░рдг рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЪрдпрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдПрдХ рд╡рд┐рдХрд▓реНрдк рдЕрдкрдирд╛ рдзрд╛рдЧрд╛ рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЯрд░реНрдорд┐рдиреЗрдЯ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред
thread = new Thread(ThreadRun); thread.Start();
рджреВрд╕рд░рд╛ рд╡рд░реНрдЧ, рдЬреЛ рдПрдХ рд╣реА рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ, рдорд╛рдирдХ рдереНрд░реЗрдбрдкреВрд▓ рдореЗрдВ рдЕрдкрдиреА рд╡рд┐рдзрд┐ рдЬреЛрдбрд╝рддрд╛ рд╣реИред рдЗрд╕рдХреА рдЕрдкрдиреА рдХрдорд┐рдпрд╛рдВ рд╣реИрдВ, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдпрджрд┐ рдореБрдЦреНрдп рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдкреВрд▓ рд╕реЗ рдХрдИ рдереНрд░реЗрдбреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдзрд╛рдЧрд╛ рд╢реБрд░реБрдЖрдд рдХреЗ рд╕рд╛рде рдмрд╣реБрдд рджреЗрд░реА рд╣реЛ рд╕рдХрддреА рд╣реИред рдПрдХ рдЦреБрд╢реА - рдЗрд╕реЗ рдЯрд░реНрдорд┐рдиреЗрдЯ () рдХрд╣рдХрд░ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдпрд╣ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдмрдВрдж рдХрд░рдиреЗ рдкрд░ рдЦреБрдж рдХреЛ рдмрдВрдж рдХрд░ рджреЗрдЧрд╛ред
ThreadPool.QueueUserWorkItem(ThreadRun);
рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдореИрдиреБрдЕрд▓рдПрдиреЗрдЯрдЗрд╡реЗрдВрдЯ рдХреЛ рдПрдХ рдЗрдирдкреБрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдереНрд░реЗрдбреНрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХрдИ рд╡рд░реНрдЧреЛрдВ рдХреЛ рдЦрд┐рд▓рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рдЗрд╕реЗ рдПрдХ рдХреЗрдВрджреНрд░реАрдХреГрдд рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд╕рдорд╛рдкреНрддрд┐ рдШрдЯрдирд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдореИрдВрдиреЗ рд▓рдХрдбрд╝рд╣рд╛рд░реЗ рдореЗрдВ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛, рд▓реЗрдХрд┐рди рд╕рд┐рд░реНрдл рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдореИрдВрдиреЗ рдЗрд╕ рдЕрд╡рд╕рд░ рдХреЛ рдЬреЛрдбрд╝рд╛ред рд╕рдорд╛рдкрди рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдПрдХ рдИрд╡реЗрдВрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд╛рд░реНрдп рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рднреА рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдХрддрд╛рд░ рдореЗрдВ рдПрдХ рдирдпрд╛ рд╕рдВрджреЗрд╢ рдЖрдпрд╛ рд╣реИред рдРрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ
EventWaitHandle[] events = new EventWaitHandle[2]; ... events[0] = new AutoResetEvent(false); events[1] = terminateEvent ?? new ManualResetEvent(false);
рдпрд╣рд╛рдБ рдпрд╣ рдмрд┐рд▓реНрдХреБрд▓ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рдЯрд░реНрдорд┐рдиреЗрдЯ рдкрджреНрдзрддрд┐ рдХрд╛ рдХрд╛рд░реНрдп рдШрдЯрдирд╛рдУрдВ [1] рдХреЛ рдПрдХ рдкрд░ рд╕реЗрдЯ рдХрд░рдирд╛ рд╣реИред
рдкреНрд░реЗрд╖рд┐рдд рд╕рдВрджреЗрд╢реЛрдВ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдХрддрд╛рд░ рдХреА рдХрддрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛; рднреЗрдЬреЗрдВ () рд╡рд┐рдзрд┐ рдХреЛ рдХреЗрд╡рд▓ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╕реЗ рдХреЙрдкреА рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
lock (queSync) { queue.Enqueue(msg); } events[0].Set();
рджреВрд╕рд░реА рддрд░рдл рд╕рдВрджреЗрд╢ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ "рдПрдХрддреНрд░рд┐рдд" рд╕реНрдЯреНрд░реАрдо рджреНрд╡рд╛рд░рд╛ рдХрддрд╛рд░ рдЕрд╡рд░реБрджреНрдз рдХрд░рдиреЗ рдХреЗ рд╕рдордп рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдереЛрдбрд╝реА рдЪрд╛рд▓ рдХрд╛ рд╕рд╣рд╛рд░рд╛ рд▓реЗрдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдХрддрд╛рд░ рдкрд░ рддрд╛рд▓рд╛ рдЦреБрдж рдирд╣реАрдВ рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ рдЕрд▓рдЧ рд╕реЗ рдмрдирд╛рдИ рдЧрдИ рд╡рд╕реНрддреБ рдкрд░ред рдкреНрд░рд╛рдкреНрдд рдзрд╛рдЧрд╛ рдПрдХ рдЕрдирдВрдд рд▓реВрдк рдХреЗ рдЕрдВрджрд░ рдШреВрдорддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рд╕реЗ рдЙрддреНрдкрд╛рджрди рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдпрджрд┐ рд╕реВрдЪрдХрд╛рдВрдХ рдПрдХ рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдШрдЯрдирд╛рдУрдВ [1] рдиреЗ рдХрд╛рдо рдХрд┐рдпрд╛, рдпрд╛ рддреЛ рдЯрд░реНрдорд┐рдиреЗрдЯ рд╡рд┐рдзрд┐ рд╕реЗ рдпрд╛ рдмрд╛рд╣рд░ рд╕реЗ, рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рдХрд╣рд╛ рдерд╛ред
while ((index = WaitHandle.WaitAny(events, currentTimeout)) != 1)
WaitAny рд╡рд┐рдзрд┐ рдереНрд░реЗрдб рдХреЛ рдмреНрд▓реЙрдХ рдХрд░рддреА рд╣реИ рдЬрдм рддрдХ рдХрд┐ рдШрдЯрдирд╛рдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХреЛ рдЯреНрд░рд┐рдЧрд░ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдпрд╛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдПрдХ рд╕рдордп-рд╕реАрдорд╛ рдЕрдирдиреНрдд рдкрд░ рд╕реЗрдЯ рд╣реЛрддреА рд╣реИред рдпрд╣реА рд╣реИ, рд▓рдХрдбрд╝рд╣рд╛рд░рд╛ рдХрд╛ рдкреНрд░рд╡рд╛рд╣ рд╕реЛ рдЬрд╛рдПрдЧрд╛ рдФрд░ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдЖрд╡реЗрджрди рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдЬрдм рддрдХ рдХрд┐ рдпрд╣ рд▓реЙрдЧ рднреЗрдЬрдирд╛ рд╢реБрд░реВ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдЬрдм рдЯреНрд░рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо рдЬрд╛рдВрдЪрддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рдХреЛрдИ рдЯрд╛рдЗрдордЖрдЙрдЯ рдерд╛ рдФрд░ рд╕рдВрдмрдВрдзрд┐рдд рдШрдЯрдирд╛ рдХреЛ рд╕рдХреНрд░рд┐рдп рдХрд░реЗрдВред
if (index == WaitHandle.WaitTimeout) { OnTimeout(); currentTimeout= Timeout.Infinite; }
рдпрд╣рд╛рдВ рджреВрд╕рд░реА рдкрдВрдХреНрддрд┐ рдЗрдХрд╛рдИ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рдХрд╛рд░рдг рд╕рдЯреАрдХ рд░реВрдк рд╕реЗ рджрд┐рдЦрд╛рдИ рджреА, рдХреЛрдбрд┐рдВрдЧ рдХреЗ рджреМрд░рд╛рди рдореИрдВрдиреЗ рдЗрд╕реЗ рдпрд╛рдж рдХрд┐рдпрд╛ред рдлрд┐рд░, рдЕрдиреНрдпрдерд╛, рдХрддрд╛рд░ рд╕реЗ рд╕рдВрджреЗрд╢реЛрдВ рдХреЛ рдкреБрдирд░реНрдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рдЙрдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХреЗ рд╕рд╛рде OnReceive рдЗрд╡реЗрдВрдЯ рдмрдврд╝рд╛рдПрдВред "рдЯреНрд░рд┐рдХ" рдЬрд┐рд╕рдХрд╛ рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдерд╛, рдХреЛрдб рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреЗ рд░рд╣реА рд╣реИред
Queue<T> replacement = new Queue<T>(); Queue<T> items; lock (queSync) { items = queue; queue = replacement; } foreach (T t in items) { OnReceive(t); } currentTimeout = timeout;
рдЗрд╕ рд╡рд░реНрдЧ рдХреЗ рд╕рднреА рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд┐рдВрджреБрдУрдВ рдХреЗ рд▓рд┐рдП, рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ, рдпрд╛ рдореЙрдбреНрдпреВрд▓, рдореИрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЪрд▓рд╛ рдЧрдпрд╛, рдЗрд╕рдХрд╛ рдкреВрд░рд╛ рдХреЛрдб, рдЕрдиреНрдп рд╕рднреА рд╡рд░реНрдЧреЛрдВ рдХреА рддрд░рд╣, рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдореЗрдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдореИрдВ рд▓реЗрдЦ рдХреЗ рдЕрдВрдд рдореЗрдВ рд▓рд┐рдВрдХ рдкреЛрд╕реНрдЯ рдХрд░реВрдВрдЧрд╛ рдФрд░ рдореИрдВ рдЗрд╕ рдЕрд╕реНрд╡реАрдХрд░рдг рдХреЛ рдирд╣реАрдВ рджреЛрд╣рд░рд╛рдКрдВрдЧрд╛;
рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд▓реЗрдЦ рд▓рд┐рдЦрдиреЗ рдХреЗ рд╕рдордп, рдкрд╛рдЧрд▓ рд╡рд┐рдЪрд╛рд░ рд╕рдорд╡рд░реНрддреА queueue рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдорди рдореЗрдВ рдЖрдпрд╛ рдерд╛, рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рдЪрд╛рд▓ рдХреЗ рдмрд┐рдирд╛, рд▓реЗрдХрд┐рди рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд╡рд░реБрджреНрдз рдХрд┐рдП рдмрд┐рдирд╛ред рдФрд░ рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдХрд┐ рджреЛрдиреЛрдВ рдкреНрд░рдХрд╛рд░ рдХреА рдзрд╛рд░рд╛рдПрдВ рдмрдирд╛рдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдХреЛ рдЫреЛрдбрд╝ рджреЗрдВред рдЗрд╕рд▓рд┐рдП, рдЗрд╕рдХреЗ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рдкреАрдЫреЗ рдХреА рдзрд╛рд░рд╛ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЛ рдПрдирдХреИрдкреНрд╕реБрд▓реЗрдЯ рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЬрд┐рд╕реЗ рдореИрдВ рдЖрдИрдПрд╕рдЯреАрдЖрд░рдЖрд░ рдХрд╣реВрдВрдЧрд╛, рдХрдХреНрд╖рд╛рдПрдВ рдкреНрд░рддреНрдпреЗрдХ рдореЗрдВ рдПрдХ рд╣реА рд╡рд┐рдзрд┐ рд╕реЗ рдорд┐рд▓рдХрд░ рд╣реЛрдВрдЧреАред рд╡реИрд╕реЗ, рдпрд╣рд╛рдВ рдПрдХ рд▓рдВрдмреЛрджрд░ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдХрд╛рдлреА рд╕рдВрднрд╡ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдореБрдЭрдореЗрдВ рдПрд╕реНрдереЗрдЯ рдиреЗ рдЗрд╕рдХрд╛ рд╡рд┐рд░реЛрдз рдХрд┐рдпрд╛ред рдирддреАрдЬрддрди, рдкреБрд▓ рдХреЗ рдЬрд╛рдиреЗ-рдорд╛рдиреЗ рдкреИрдЯрд░реНрди рдХреЗ рд╕рдорд╛рди рдХреНрдпрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬрд╣рд╛рдВ "рдкреБрд▓ рдХреЗ рдЗрд╕ рддрд░рдл" рджреЛ рд╡рд░реНрдЧ рд╣реИрдВ, рдПрдХ рддрд╛рд▓реЗ рдХреЗ рд╕рд╛рде, рджреВрд╕рд░рд╛ рдЗрдВрдЯрд░рд▓реЙрдХ рдХреЗ рд╕рд╛рде, рдФрд░ "рдкреБрд▓ рдХреЗ рджреВрд╕рд░реА рддрд░рдл" рдЙрдирдХреЗ рд▓рд┐рдП рдкреНрд░рд╡рд╛рд╣ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рджреЛ рд╡рд┐рдХрд▓реНрдк рд╣реИрдВ, рдФрд░ рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдмреАрдЪ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╡реЗ рдХрд┐рд╕реА рднреА рд╕рдВрдпреЛрдЬрди рдореЗрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред GoF рдХреЗ "рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рд╕рд╛рде рд╕рд╣рднрд╛рдЧрд┐рддрд╛, рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╕рд╛рде рдирд╣реАрдВ" (c) рдХреА рд╡рд┐рдЪрд╛рд░рдзрд╛рд░рд╛ рдХрд╛ рдкреВрд░рд╛ рдЖрдХрд░реНрд╖рдг рди рдХреЗрд╡рд▓ рдЗрд╕ рддрдереНрдп рдореЗрдВ рд╡реНрдпрдХреНрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдЕрдиреНрдп рд╡рд░реНрдЧреЛрдВ рдХреЛ рдЫреВрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрдЧреА, рд▓реЗрдХрд┐рди рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ "рдпреВрдирд┐рдЯ рдкрд░реАрдХреНрд╖рдг" рдХреЛ рднреА рдмрджрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред ред рдмрд╣реБрдд, рдмрд╣реБрддред рдХреЗрд╡рд▓ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдмрдирд╛рдиреЗ рдХреА рдмрд╣реБрд░реВрдкрддрд╛ рд╡рд┐рдзрд┐ рдХреЛ рдмрджрд▓рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рдЬреЛ рдЗрди рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рд╕рд╛рде рд╕рднреА рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЛ рдЦрд┐рд▓рд╛рддрд╛ рд╣реИред
рдЯреАрдбреАрдбреА рдХреА рд╢реБрд░реБрдЖрдд
рдореИрдВ рд╡рд┐рд╖рдп рдкрд░ рдереЛрдбрд╝рд╛ рд╕реИрджреНрдзрд╛рдВрддрд┐рдХ рд╣реВрдВред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЙрд╕ рд╡рд░реНрдЧ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдкрд░, рдЬреЛ рдкрд╣рд▓реЗ рдерд╛, рдФрд░ рджреВрд╕рд░рд╛ рд╕рдорд╛рди рдерд╛, рд╡рд┐рдХрд╛рд╕ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдЯреАрдбреАрдбреА рдХреЗ рддрд╣рдд рдЕрднрд┐рд╡реНрдпрдХреНрдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рдерд╛, рдЬрд╣рд╛рдВ рдкрд╣рд▓реЗ рдкрд░реАрдХреНрд╖рдг, рдлрд┐рд░ рдХреЛрдб рд╣реАред рдореЗрд░реЗ рд╡рд┐рдХрд╛рд╕ рдХрд╛ рдорд╛рд░реНрдЧ рдирд┐рдореНрди рдЪрд░рдгреЛрдВ рд╕реЗ рдЧреБрдЬрд░рд╛ - рдХрд╛рд░реНрдп рдХреЛрдб рд▓рд┐рдЦрдирд╛, рдлрд┐рд░ рдкрд░реАрдХреНрд╖рдг рдХреЗ рдорд╛рдорд▓реЗ рд▓рд┐рдЦрдирд╛, рдлрд┐рд░ рдкрд╣рд▓реЗ рдФрд░ рджреВрд╕рд░реЗ рджреЛрдиреЛрдВ рдХреЛ рд╕рдорд╛рдпреЛрдЬрд┐рдд рдХрд░рдирд╛, рдорд╛рдирдХ рддрдХ рд▓рд╛рдирд╛ред рдЙрд╕рдХреЗ рдмрд╛рдж, рдкрд░реАрдХреНрд╖рдг "рд╕рддреНрдп рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╣рдЪрд╛рдиреЗ рдЬрд╛рддреЗ рд╣реИрдВ", рдФрд░ рд░рд┐рдлреИрдХреНрдЯрд░рд┐рдВрдЧ, рдЬреЛ рдмрд╛рдж рдореЗрдВ рдЕрдиреБрд╕рд░рдг рдХрд░рддреЗ рд╣реИрдВ, рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдЙрди рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рдореБрдЭреЗ рдХреНрдпреЛрдВ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЛ рдЬреАрд╡рди рдХрд╛ рдЕрдзрд┐рдХрд╛рд░ рд╣реИ, рдХрдо рд╕реЗ рдХрдо рд╢реБрд░реБрдЖрдд рдХреЗ рд▓рд┐рдП: рдпрджрд┐ рд╣рдо рд╕рд░рд▓рддрдо рдХрд╛рд░реНрдп A = B + C рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдкрд░реАрдХреНрд╖рдг рд╕реВрддреНрд░ C1 = A - B рджреНрд╡рд╛рд░рд╛ рд╕реБрдЭрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рддреБрд▓рдирд╛ C рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдкрд░реАрдХреНрд╖рдг рдХреА рд╕рдлрд▓рддрд╛ рдХрд╛ рдирд┐рд╖реНрдХрд░реНрд╖ рдирд┐рдХрд╛рд▓рд╛ рдЬрд╛рддрд╛ рд╣реИред == C1ред рдпрд╣рд╛рдВ рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдП рдЧрдП рдлрд╝рдВрдХреНрд╢рди рдФрд░ рдкрд░реАрдХреНрд╖рдг рдПрдХ рджреЛрдиреЛрдВ рдореЗрдВ рдирд┐рд╣рд┐рдд рд╣реЛ рд╕рдХрддреА рд╣реИрдВред рдЗрд╕рд╕реЗ рднреА рдЕрдзрд┐рдХ, рдЪреВрдВрдХрд┐ рдЗрд╕рдореЗрдВ рдЕрдзрд┐рдХ рдХреНрд░рд┐рдпрд╛рдПрдВ рд╣реИрдВ, рдПрдХ рдЧрд▓рддреА рдЕрдзрд┐рдХ рд╣реЛрдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИред рдЗрд╕ рдмрд┐рдВрджреБ рдкрд░, рдХрд┐рд╕реА рдХреЛ рдЖрд╢реНрдЪрд░реНрдп рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдкрд░реАрдХреНрд╖рдг рдЖрдЦрд┐рд░ рдХреНрдпреЛрдВ рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рд▓реЗрдХрд┐рди рдЬрд╡рд╛рдм рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ рдкрд╣рд▓реЗ рд╕реЗ рдореМрдЬреВрдж рд╣реИ, рд╣рдорд╛рд░реЗ рд╕рд╛рдордиреЗ рд╕рдм рдХреБрдЫ рддреИрдпрд╛рд░ рд╣реИред рдкрд░реАрдХреНрд╖рдг "рдкрд╛рд░рд┐рдд" рджрд┐рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рд╢рд░реНрддреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХреЛ рдкреВрд░рд╛ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рджреЛрдиреЛрдВ рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреА рдЕрдиреБрдкрд╕реНрдерд┐рддрд┐, рдпрд╛ рдПрдХ рддреНрд░реБрдЯрд┐ рджреЛрдиреЛрдВ рдХреА рдПрдХ рд╕рд╛рде рдореМрдЬреВрджрдЧреАред рджреЛрдиреЛрдВ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рд╣реЛрдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдкреНрд░рддреНрдпреЗрдХ рддреНрд░реБрдЯрд┐ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рд╕реЗ рдХрдо рд╣реИ, рдЦрд╛рд╕рдХрд░ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣рд╛рдВ рдЙрдкрд╕реНрдерд┐рддрд┐ рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реИ, рдпрд╣ рднреА рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдХрд┐ рддреНрд░реБрдЯрд┐рдпрд╛рдВ synergistic рд╣реИрдВ, рдЕрд░реНрдерд╛рдд, рдПрдХ рджреВрд╕рд░реЗ рдХреЗ рдкреНрд░рднрд╛рд╡ рдХреЗ рд▓рд┐рдП рдХреНрд╖рддрд┐рдкреВрд░реНрддрд┐ рдХрд░рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдФрд░ рднреА рдХрдо рд╣реИред рдпрд╣реА рд╣реИ, рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЛ рд▓рд┐рдЦрдиреЗ рдХреЗ рд╕рднреА рдкреНрд░рдпрд╛рд╕ рд╕реАрдзреЗ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреЗ рдЙрджреНрджреЗрд╢реНрдп рд╕реЗ рд╣реИрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЬрдм рдПрдХ рд╣реА рд╡реНрдпрдХреНрддрд┐ рджреНрд╡рд╛рд░рд╛ рдкрд░реАрдХреНрд╖рдг рдФрд░ рдХреЛрдб рджреЛрдиреЛрдВ рд▓рд┐рдЦреЗ рдЬрд╛рддреЗ рд╣реИрдВ, рддреЛ рд╡рд╣ рдПрдХ рд╣реА рдЧрд▓рддреА рдХрд░реЗрдЧрд╛ рдЗрд╕рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдереЛрдбрд╝реА рдЕрдзрд┐рдХ рд╣реИред рдареАрдХ рд╣реИ, рдареАрдХ рд╣реИ, рдпрд╣ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕рд╛рдЗрдХрд┐рд▓ рдХреЗ рд▓рд┐рдП, рдФрд░ рдЬреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЕрдЪреНрдЫрд╛ рд╣реИред
рдкрд╣рд▓реЗ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЛ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдЧреЗ рдмрдврд╝рддреЗ рд╣реИрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдкрд╣рд▓реЗ IQueued рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдирд╛рдо рдкрд░ рд░рд╛рдЗрдЯ-рдХреНрд▓рд┐рдХ рдХрд░рдХреЗ рдФрд░ рд╕рдВрдмрдВрдзрд┐рдд рдореЗрдиреВ рдЖрдЗрдЯрдо рдХрд╛ рдЪрдпрди рдХрд░рдХреЗ рдПрдХ рдкрд░реАрдХреНрд╖рдг рдЯреЗрдореНрдкрд▓реЗрдЯ рдмрдирд╛рдПрдВред рддреЛ, рдЗрд╕ рд╡рд░реНрдЧ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдореЗрдВ рдХреНрдпрд╛ рд▓рдЧрддрд╛ рд╣реИред рдЗрд╕реЗ рдЕрд▓рдЧ-рдерд▓рдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реАрдХреНрд╖рдг рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдлрд┐рд░ рдЖрдкрдХреЛ рдЙрди рдХрдХреНрд╖рд╛рдУрдВ рдХреА рдореЛрдХреА (рдирдХрд▓ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ) рдмрдирд╛рдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рд╣реИ рдЬреЛ рд╡рд┐рд╖рдп рд╡рд░реНрдЧ рдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд рдХрд░рддреЗ рд╣реИрдВред рдПрдХ рдЕрдиреНрдп рдмрд┐рдВрджреБ рдпрд╣ рд╣реИ рдХрд┐ рдЪреВрдВрдХрд┐ рдкрд░реАрдХреНрд╖рдг рдХрд╛ рдЙрджреНрджреЗрд╢реНрдп рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдЪреБрдирдирд╛ рдерд╛, рдФрд░ рд╢реБрд░реБрдЖрдд рдореЗрдВ рджреЛ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХрдХреНрд╖рд╛рдПрдВ рдереАрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдФрд░ рдмрд╛рдж рдореЗрдВ 2 рдХреЗ 2 рдХреЗ 4 рд╕рдВрдпреЛрдЬрдиреЛрдВ рдХреА, рдпрд╣ рдПрдХ рдЕрдореВрд░реНрдд рд╕рдВрд╢реЛрдзрдХ рдХреЗ рд╕рд╛рде рдирдП рд╕рд┐рд░реЗ рд╕реЗ рдмрдирд╛рдП рдЧрдП рдкрд░реАрдХреНрд╖рдг рд╡рд░реНрдЧ рдХреЛ рдкреБрд░рд╕реНрдХреГрдд рдХрд░рдиреЗ рдФрд░ рдЗрд╕рдореЗрдВ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдкреИрд░рд╛рдореАрдЯрд░ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИред
[TestClass()] public abstract class IQueuedTest<T>
рдЪреВрдВрдХрд┐ рдХрдХреНрд╖рд╛ рдЕрдореВрд░реНрдд рд╣реИ, рдЗрд╕рд▓рд┐рдП рдкрд░реАрдХреНрд╖рдг рд╕реАрдзреЗ рдЙрд╕ рдкрд░ рдирд╣реАрдВ рдХрд┐рдП рдЬрд╛рдПрдВрдЧреЗ, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдмрдЬрд╛рдп рдЗрд╕рдХреЗ рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рд╕рднреА рдкрд░реАрдХреНрд╖рдг рдХрдХреНрд╖рд╛рдУрдВ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдореЗрдВ рдПрдХ рд╕реЗрд╡рд╛ рд╡рд░реНрдЧ рдЙрдкрднреЛрдХреНрддрд╛ рд╕рд┐рдореНрдпреБрд▓реЗрдЯрд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
class Tester<T1>
рдпрд╣ рд╡рд░реНрдЧ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдП рдЧрдП рд╡рд░реНрдЧ рдХреА рдШрдЯрдирд╛рдУрдВ рдХреА рд╕рджрд╕реНрдпрддрд╛ рд▓реЗрдЧрд╛, рдШрдЯрдирд╛рдУрдВ рдХреЗ рдЯреНрд░рд┐рдЧрд░ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдЧрд╛, рдФрд░ рдпрд╛рдж рд░рдЦреЗрдЧрд╛ рдХрд┐ рдЗрд╕ рдШрдЯрдирд╛ рдореЗрдВ рдХреНрдпрд╛ рд╣реБрдЖ рдерд╛ред
public Tester(IQueued<T1> tested) { tested.OnReceive += Received; tested.OnTimeout += TimeOut; } void TimeOut() { timedCount++; } void Received(T1 item) { Thread.Sleep(delay); receivedCount++; lastItem = item; }
рдЗрд╕ рдЖрдВрддрд░рд┐рдХ рд╡рд░реНрдЧ рдХреЗ рдЕрддрд┐рд░рд┐рдХреНрдд, рдЖрдкрдХреЛ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рддрд░реАрдХреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, рдЬрд┐рд╕реЗ рд╣рдо рд╕рднреА рдЙрддреНрддрд░рд╛рдзрд┐рдХрд╛рд░рд┐рдпреЛрдВ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдХреГрдд рдХрд░реЗрдВрдЧреЗред
protected abstract IQueued<T> createSubject(); protected abstract T CreateItem();
рддреЛ, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдПред рд╡реИрд╕реЗ, рдЗрд╕ рддрд░рд╣ рдХреЗ рд▓реЗрдЦреЛрдВ рдХреЛ рдкрдврд╝рддреЗ рд╕рдордп, рдореИрдВрдиреЗ рджреЗрдЦрд╛ рдХрд┐ рд▓реЗрдЦрдХ рд░реЗрдХ рдХреЛ рдЫреЛрдбрд╝ рджреЗрддреЗ рд╣реИрдВ, рдФрд░ рддреИрдпрд╛рд░ рд╕рдорд╛рдзрд╛рди рджреЗрддреЗ рд╣реИрдВред рдореИрдВ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдХреБрдЫ рд░реЗрдХ рдкрд░ рд░рд╣рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реВрдБрдЧрд╛ред рдкрд╣рд▓реА рд╕рдорд╕реНрдпрд╛ рдЬрд┐рд╕рдХрд╛ рдореБрдЭреЗ рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдкрдбрд╝рд╛, рд╡рд╣ рдереНрд░реЗрдб рдкреВрд▓ рдореЗрдВ рд╢реБрд░реВ рд╣реЛрдиреЗ рдореЗрдВ рджреЗрд░реА рдереАред рдЬрдм рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдкреВрд▓ рдХреЗрд╡рд▓ рдХреБрдЫ рдзрд╛рдЧреЗ рд░рдЦрддрд╛ рд╣реИ, рдФрд░ рдХреЗрд╡рд▓ рджреЗрд░реА рдХреЗ рд╕рд╛рде рдирдП рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдПрдХ рд╕реЗрдХрдВрдб рдХреЗ рджрд╕рд╡реЗрдВ рд╣рд┐рд╕реНрд╕реЗ рдореЗрдВ рдорд╛рдкрд╛ рдЬрд╛рддрд╛ рд╣реИред рдФрд░ рдкрд░реАрдХреНрд╖рдг рд░реВрдкрд░реЗрдЦрд╛ рд╕рдорд╛рдирд╛рдВрддрд░ рд░реВрдк рд╕реЗ рдкрд░реАрдХреНрд╖рдг рдЪрд▓рд╛рдиреЗ рд▓рдЧрддреА рд╣реИред рдЗрд╕ рд╡рдЬрд╣ рд╕реЗ, "рдореИрдиреБрдЕрд▓" рдкреНрд░рд╡рд╛рд╣ рдХреЗ рд╕рд╛рде рдкрд░реАрдХреНрд╖рдг рд╕рдлрд▓ рд░рд╣реЗ, рд▓реЗрдХрд┐рди рдкреВрд▓ рд╕реЗ рдкреНрд░рд╡рд╛рд╣ рдХреЗ рд╕рд╛рде рдХреБрдЫ рдкрд╛рд░рд┐рдд рд╣реЛ рдЧрдП, рдХреБрдЫ рдЧрд┐рд░ рдЧрдПред рдЗрд╕рд▓рд┐рдП, рджреЛ рд╡рд┐рдХрд▓реНрдк рд╣реИрдВ: рдПрдХ рд╣реА "рд▓рдВрдмреА" рд╡рд┐рдзрд┐ рдореЗрдВ рд╕рднреА рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХрд╛ рдЪрдпрди рдХрд░реЗрдВ, рдЬрд┐рд╕реЗ рддреЗрдЬреА рд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдирд┐рд░реНрдгрдп рдЬрд╛рд░реА рдХрд░реЗрдЧрд╛, рдпрд╛ рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдб рдХреЗ рд╕рд╛рде рдЖрдПрдЧрд╛ред рдореИрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЗ рд╕рд╛рде рдЖрдпрд╛:
void ActivationTestHelper(Tester<T> tester, IQueued<T> subject) { int retry = 30; while (!subject.Active && retry > 0) { retry--; Thread.Sleep(SleepDelay); } Assert.AreEqual(true, subject.Active); }
рдзрд╛рд░рд╛ рд╕рдХреНрд░рд┐рдп рд╣реЛрдиреЗ рддрдХ "рдкреНрд░рддреАрдХреНрд╖рд╛" рдХрд░рдиреЗ рдХреЗ 30 рдкреНрд░рдпрд╛рд╕, рдЬрд┐рд╕рдХреЗ рдмрд╛рдж рдХреЗрд╡рд▓ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдЖрдЧреЗ рдмрдврд╝реЗрдВред рд╕реГрдЬрди рдХреЗ рддреБрд░рдВрдд рдмрд╛рдж рд╕рд╣рд╛рдпрдХ рдХреЛ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рдФрд░, рдлрд┐рд░ рд╕реЗ - рддреЛ, тАЛтАЛрдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдПред рдПрдХ рд╕рдВрджреЗрд╢ рднреЗрдЬрдиреЗ-рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд╣рд▓рд╛ рдкрд░реАрдХреНрд╖рдг рд╣реИред рдЪреВрдБрдХрд┐ рд╣рдо рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдХрдХреНрд╖рд╛ рдХрд╛ рдХрд╛рд░реНрдп рдХрд┐рд╕реА рдЕрдиреНрдп рд╕реВрддреНрд░ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдирд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдкрд░реАрдХреНрд╖рдХ рд╡рд░реНрдЧ рдХреЛ рднреЗрдЬрдиреЗ рд╡рд╛рд▓реЗ рд╕реНрдЯреНрд░реАрдо рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдПрдХ рд╕рдВрджреЗрд╢ рдкреНрд░рд╛рдкреНрдд рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рдлрд┐рд░ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рдпрд╣ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдкреНрд░рд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИред рдпрд╣ рдЗрд╕рдХреЗ рд▓рд┐рдП рд╣реИ (рдкрд╣рд▓реА рдмрд╛рд░), рд╡реИрд╕реЗ, рдкрд░реАрдХреНрд╖рдХ рдХреЛ рдкреНрд░рд╛рдкреНрдд рд╡рд┐рдзрд┐ рдХреЗ рдХреЛрдб рдореЗрдВ 50ms рдХреА рджреЗрд░реА рд╣реИред рдпрджрд┐ рдХреЙрд▓рд┐рдВрдЧ рдереНрд░реЗрдб рдореЗрдВ рдпрд╣ рд╡рд┐рд▓рдВрдм рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдкрд╣рд▓рд╛ рдЕрднрд┐рдХрд░реНрддрд╛ рдкрд░реАрдХреНрд╖рдг рдореЗрдВ рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рдПрдЧрд╛ред
[TestMethod()] public void SendTest() { var subject = createSubject(); var tester = new Tester<T>(subject); ActivationTestHelper(tester, subject); T item = CreateItem(); tester.delay = SleepDelay; subject.Send(item); Assert.AreEqual(0, tester.receivedCount);
рдЕрдЧрд▓рд╛, рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рд╕рдВрджреЗрд╢ рдкреНрд░реЗрд╖рд┐рдд рд╣реИ, рд╣рдо 100ms рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░реЗрдВрдЧреЗ рдФрд░ рдкреНрд░рд╛рдкреНрдд рдПрдХ рдХреА рдЬрд╛рдВрдЪ рдХрд░реЗрдВрдЧреЗред рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рдЗрди рдореВрд▓реНрдпреЛрдВ рдХреЛ рдХрдо рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдореБрдЦреНрдп рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рджреВрд╕рд░реА рджреЗрд░реА рдкрд╣рд▓реЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣рд╛рдВ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рд╣реИред рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рд▓рд┐рдП "рд░рд╛рд╕реНрддрд╛" рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╡рд╛рд╣ рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордд рднреВрд▓рдирд╛ред
Thread.Sleep(SleepDelay2); Assert.AreEqual(1, tester.receivedCount); Assert.IsTrue(tester.lastItem.Equals(item)); subject.Terminate(); }
рдЕрдЧрд▓рд╛, рдПрдХ рдЯрд╛рдЗрдордЖрдЙрдЯ рдкрд░реАрдХреНрд╖рдгред рдСрдмреНрдЬреЗрдХреНрдЯ рднреА рдмрдирд╛рдПрдВ, рд╕рдХреНрд░рд┐рдпрдг рд╕рд╣рд╛рдпрдХ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░реЗрдВред рд╣рдо рдЯрд╛рдЗрдордЖрдЙрдЯ рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдпрд╣ рднреА рдЬрд╛рдВрдЪрддреЗ рд╣реИрдВ рдХрд┐ рдЗрд╕реЗ рдХреЙрд▓рд┐рдВрдЧ рдереНрд░реЗрдб рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдирд╣реАрдВ рдХрд╣рд╛ рдЧрдпрд╛ рдерд╛, рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рдмрд╛рдж рдмреБрд▓рд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдФрд░ рдХреЗрд╡рд▓ рдПрдХ рдмрд╛рд░ред
[TestMethod()] public void TimeoutTest() { var subject = createSubject(); var tester = new Tester<T>(subject); subject.setTimeout(SleepDelay); ActivationTestHelper(tester, subject); T item = CreateItem(); subject.Send(item); Assert.AreEqual(0, tester.timedCount); Thread.Sleep(SleepDelay3); Assert.AreEqual(1, tester.timedCount); }
рдЗрд╕ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП, 200 рдореА рдХреА рджреЗрд░реА рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХреА рдЧрдИ рдереА, рдЯрд╛рдЗрдордЖрдЙрдЯ рдореВрд▓реНрдп рдХрд╛ рдЪрд╛рд░ рдЧреБрдирд╛, рдФрд░ рдпрд╣ рдкрд░реАрдХреНрд╖рд╛ рдереА рдЬрд┐рд╕рдиреЗ рдореЗрд░реА рдкрд╣рд▓реА рддреНрд░реБрдЯрд┐, рдПрдХ рдУрд╡рд░рд╕рд╛рдЗрдЯ рдХреЛ рдкрдХрдбрд╝рд╛, рдЬрд┐рд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рдмрд╛рдд рдХреА рдереАред рдЗрдХрд╛рдИ рдкрд░реАрдХреНрд╖рдг рд╕реБрдЦрдж рдирд┐рдХрд▓рд╛ рдФрд░ рдпрд╣, рдХрд┐ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХрд╛ рдкреВрд░реНрдг рдмрд╣реБрдордд рди рдХреЗрд╡рд▓ "рдЙрддреНрдкрд╛рджрди" рддрдХ рдкрд╣реБрдВрдЪрддрд╛ рд╣реИ, рдмрд▓реНрдХрд┐ рдЕрд▓реНрдлрд╛ рдкрд░реАрдХреНрд╖рдг рднреА рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдЗрди рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХрд╛, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рд╡рд╣рд╛рдБ рдкрддрд╛ рд▓рдЧрд╛рдпрд╛ рдЧрдпрд╛ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рд▓реЗрдЦрди рдкрд░реАрдХреНрд╖рдгреЛрдВ рдкрд░ рдЦрд░реНрдЪ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдХрд╛рдо рдХреЛ рдЕрднреА рднреА рдбрд┐рдмрдЧрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдкрд░рд┐рдгрд╛рдо рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреА рд╕рдордп рдкреНрд░рдмрдВрдзрди рддрдХрдиреАрдХ рдереА рдЬреЛ рдЙрд╕ рдЕрд╡рдзрд┐ рд╕реЗ рдХрд╛рдо рдХреА рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд░рд╛рд╢рд┐ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рддреА рд╣реИ рдЬрдм рдЖрдкрд╛рддрдХрд╛рд▓ "рдЖрд▓рд╕реА" рд╡рд┐рдХрд╛рд╕ рдХреА рдЕрд╡рдзрд┐ рдореЗрдВ рдерд╛ред рдФрд░ рдпрд╣ рд╕рдм рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рд░рд┐рдлреИрдХреНрдЯрд┐рдВрдЧ рдореЗрдВ рдЕрдореВрд▓реНрдп рдорджрдж рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдП рдмрд┐рдирд╛, рдЬреЛ рдореИрдВрдиреЗ рд░рд╛рд╕реНрддреЗ рдореЗрдВ рдЦреБрдж рдХреЗ рд▓рд┐рдП рдЖрд╡рд┐рд╖реНрдХрд╛рд░ рдХрд┐рдпрд╛ рдерд╛ред
рд╢реЗрд╖ рдкрд░реАрдХреНрд╖рдг рд╕реНрдЯреНрд░реАрдо рдХрд╛ рдкреВрд░рд╛ рд╣реЛрдирд╛ рд╣реИред рдЖрдкрдХреЛ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдзрд╛рд░рд╛ рдмрдВрдж рд╣реЛ рдЧрдИ рд╣реИ рдФрд░ рдХрд╣реАрдВ рднреА рдХреБрдЫ рднреА рдкреНрд░реЗрд╖рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рд╕рднреА рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рд╛рдорд╛рдиреНрдп рдЪрд░рдгреЛрдВ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддреЗ рд╣реБрдП, рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ:
public void TerminateTest() { ... subject.Terminate(); subject.Send(item); Thread.Sleep(SleepDelay3); Assert.AreEqual(0, tester.receivedCount); Assert.AreEqual(0, tester.timedCount); }
рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдореЗрдВ рдХреЗрд╡рд▓ рддреАрди рдкрд░реАрдХреНрд╖рдг рд╣реИрдВ, рд▓реЗрдХрд┐рди рджреЛ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХрдХреНрд╖рд╛рдПрдВ рд╣реИрдВ, рд╕реНрдЯреНрд░реАрдо рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рджреЛ рдФрд░ рд╡рд┐рдХрд▓реНрдк рд╣реИрдВ, рдФрд░ рдЗрд╕рдХреЗ рдмрд╛рдж, рдореИрдВрдиреЗ рдЕрд▓рдЧ рд╕реЗ рдпрд╣ рдЬрд╛рдВрдЪрдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ рдХрд┐ рдпрд╣ рд╕рдВрдЪрд░рд┐рдд рд╕рдВрджреЗрд╢ рдХреЗ рд░реВрдк рдореЗрдВ рдХрдХреНрд╖рд╛рдУрдВ рдФрд░ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЗ рд╕рд╛рде рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдХреНрдпреЛрдВ 8 рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкрд░реАрдХреНрд╖рдг рдХрдХреНрд╖рд╛рдПрдВ рдмрдирд╛рдИ рдЬрд╛рддреА рд╣реИрдВ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рдПрдХ рдореИрдВ рджреВрдВрдЧрд╛, рдФрд░ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкрд░реАрдХреНрд╖рдг рдорд╛рдорд▓реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ 24 рд╣реИред рдкрд░реАрдХреНрд╖рдг рд╕рдВрд░рдЪрдирд╛:
public struct TestMessageStruct { public string message;
рдФрд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкрд░реАрдХреНрд╖рдг рд╡рд░реНрдЧ рдЬреЛ рд╡рд┐рдХрд▓реНрдк рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рддрд╛ рд╣реИ: рдПрдХ рдЕрд╡рд░реБрджреНрдз рдХрддрд╛рд░, рдПрдХ рдирд┐рдпрдорд┐рдд рдзрд╛рдЧрд╛, рдПрдХ рд╕рдВрд░рдЪрдирд╛ред
[TestClass()] public class IQueuedLockRegTest : IQueuedTest<TestMessageStruct> { protected override IQueued<TestMessageStruct> createSubject() { return new LockQueued<TestMessageStruct>(new RegularThreadStarter()); } protected override TestMessageStruct CreateItem() { var item = new TestMessageStruct(); var rnd = new Random(); item.id = rnd.Next(); item.message = string.Format("message {0}", item.id); return item; } }
рдпрд╣ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкрд░реАрдХреНрд╖рдг рдХрдХреНрд╖рд╛рдПрдВ рдереАрдВ, рдЬрд┐рдиреНрд╣реЛрдВрдиреЗ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкреНрд░рдпреЛрдЧрд╛рддреНрдордХ рд╡рд╕реНрддреБрдУрдВ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд┐рдпрд╛ рдерд╛, рдЬрд┐рдиреНрд╣реЗрдВ рдЗрд╕рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ рдлрд┐рд░ рд╕реЗ рддреИрдпрд╛рд░ рдХрд░рдирд╛ рдерд╛, рдЕрдЧрд░ рдореИрдВ рдЗрд╕реЗ рдХрд╣ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐, рдкреБрдирд░реНрд╡рд┐рддреНрддред рдФрд░ рдореБрдЭреЗ рдЙрдирдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рджреЛрдЧреБрдирд╛ рдХрд░рдирд╛ рдерд╛, рд▓реЗрдХрд┐рди, рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╣ рдмрд╣реБрдд рдХрдо рд╕рдордп рдФрд░ рдкреНрд░рдпрд╛рд╕ рд▓реЗрддрд╛ рд╣реИ рдЬрдм рдкрд░реАрдХреНрд╖рдг рдЦреБрдж рд▓рд┐рдЦрддреЗ рд╣реИрдВ рдФрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рддреЗ рд╣реИрдВред
рд▓рдХрдбрд╝рд╣рд╛рд░рд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдФрд░ рдкрд╣рд▓реА рдлрд╝рд┐рд▓реНрдЯрд░ рдкрд░рдд
рдореИрдВрдиреЗ рдПрдирдПрд▓рдУрдЬреА рдХреА рддрд░рд╣ рд╣реА рдЖрдЧреЗ рдХреА рд╣рд▓рдЪрд▓ рдХреЗ рдмрд┐рдирд╛ рдЗрдВрдЯрд░рдлреЗрд╕ рдмрдирд╛рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред рд╕рд┐рд░реНрдл рд╕реНрдереИрддрд┐рдХ рд╡рд░реНрдЧ LogAccess рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдХрд┐рд╕реА рдХрд╛рд░рдг рд╕реЗ, рдЕрд░реНрде рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ, рдпрд╣ рдореБрдЭреЗ рдФрд░ рдЕрдзрд┐рдХ рддрд╛рд░реНрдХрд┐рдХ рд▓рдЧ рд░рд╣рд╛ рдерд╛ред рд╡рд╣ рдЦреБрдж рдХреБрдЫ рдирд╣реАрдВ рдХрд░рддрд╛, рдХреЗрд╡рд▓ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рдХрд╛рд░рдг рд╕реЗ, рд╡рд╣ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдореЗрдВ рднрд╛рдЧ рдирд╣реАрдВ рд▓реЗрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЙрд╕ рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдирд╣реАрдВ рдХрд░реВрдВрдЧрд╛, рдореИрдВ рдХреЗрд╡рд▓ "рдмрд╛рд╣рд░" рджрд┐рдЦрд╛рдИ рджреЗрдиреЗ рд╡рд╛рд▓реЗ рдореБрдЦреНрдп рддрд░реАрдХреЛрдВ рдХреЛ рд╕реВрдЪреАрдмрджреНрдз рдХрд░реВрдВрдЧрд╛, рдкрд╣рд▓реА рд╡рд┐рдзрд┐ рдЖрдкрдХреЛ рд▓рдХрдбрд╝рд╣рд╛рд░рд╛ рдЦреБрдж рдХреЛ рд╕реНрдкреИрдо рд╕рдВрджреЗрд╢реЛрдВ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИ, рдЕрдЧрд▓реЗ рджреЛ рдирд┐рдпрдВрддреНрд░рдг рдлрд╝рд┐рд▓реНрдЯрд░рд┐рдВрдЧ рд╕реНрддрд░ рд╕реЗ, рдЖрдИрдбреА рджреНрд╡рд╛рд░рд╛ рдЙрддреНрддрд░рд╛рд░реНрджреНрдзред рдкрд╣рд▓реА рдлрд╝рд┐рд▓реНрдЯрд░рд┐рдВрдЧ рдкрд░рдд рдореЗрдВ рдореМрдЬреВрдж рд▓рдХрдбрд╝рд╣рд╛рд░реЗ рдХреЗ рдирд╛рдо, рдпрд╛ рд╢реНрд░реЗрдгреА рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдпрд╣ рдлрд╝рд┐рд▓реНрдЯрд░рд┐рдВрдЧ рдкрд┐рдЫрд▓реЗ рдЕрдиреБрднрд╛рдЧ рдореЗрдВ рд╡рд░реНрдгрд┐рдд рд╡рд░реНрдЧ рд╕реЗ рдЧреБрдЬрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдХреА рдЬрд╛рддреА рд╣реИ, рдЕрд░реНрдерд╛рдд, рдкреНрд░рддреНрдпреЗрдХ рд╢реНрд░реЗрдгреА рдХреЗ рд▓реЙрдЧ рдХреЗ рд▓рд┐рдП рд╕реНрддрд░ рдЕрд▓рдЧ рд╕реЗ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдХреНрд░рдорд╢рдГ рджреВрд╕рд░реА рдлрд╝рд┐рд▓реНрдЯрд░рд┐рдВрдЧ рдкрд░рдд рдкрд░ рдПрдХ рд╢реНрд░реЗрдгреА рдХреА рдЕрдиреБрдкрд╕реНрдерд┐рддрд┐ рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдпрд╣ рдлрд╝рд┐рд▓реНрдЯрд░рд┐рдВрдЧ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд▓реЙрдЧрд░ рд╕реНрдЯреНрд░реАрдо рдореЗрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
Logger GetLogger(string category) void SetLevel(string category, int level) void SetLevelForAll(int level) void FilterAddID(int id) void FilterRemoveID(int id)
рджреВрд╕рд░рд╛ рд╡рд░реНрдЧ, рдЬреЛ рдмрд╛рд╣рд░ рд╕реЗ рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рд╣реИ, рд▓реЙрдЧрд▓реЗрд╡рд▓ рд╣реИред рдЯреЗрд▓реАрдХреЙрдо рд╕реЗ рдореИрдВрдиреЗ рдЬреЛ рдЕрд░реНрде рдирд┐рдХрд╛рд▓реЗ рд╣реИрдВред рдлрд┐рд░ рдореИрдВрдиреЗ NLog рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛, рдФрд░ рд╕рд╛рдорд╛рдиреНрдп рдЗрдВрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдПрдХ рд╕реНрддрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд┐рдпрд╛, рддрд╛рдХрд┐ рддреБрд▓рдирд╛ рдХреЗ рд╕реНрддрд░ рдХреЗ рд╕рд╛рде рд╕рдордЭрджрд╛рд░ рди рд╣реЛ, рдЖрджрд┐ред
рдЙрдиреНрд╣реЛрдВрдиреЗ рдбрд┐рдмрдЧ рдХреЗ рджреЛ рд╕реНрддрд░реЛрдВ рдХреЛ рдЫреЛрдЯрд╛ рдФрд░ рд╡рд┐рд╕реНрддреГрдд рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рд╕рднреА рд╕реНрддрд░ рдХреЛ рдЬреЛрдбрд╝рд╛, рдЬреЛ рдХрднреА-рдХрднреА рдЕрднреНрдпрд╛рд╕ рдореЗрдВ рдХрдореА рдереАред
public const int Invalid = 0; public const int Always = 1; public const int Fatal = 2; public const int Error = 3; public const int Warning = 4; public const int Info = 5; public const int Event = 6; public const int Debug = 7; public const int All = 8; public const int Total = 9;
рдореИрдВрдиреЗ LogAccess рд╕реЗ рд╕реНрддрд░ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдХреНрд╖рд╛ рдореЗрдВ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╕рдВрдкрддреНрддрд┐ рдХреЛ рднреА рд╢рд╛рдорд┐рд▓ рдХрд┐рдпрд╛ред
рдЦреИрд░, рдФрд░ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдд, рдмрд╛рд╣рд░ рд╕реЗ рдЬреЛ рджрд┐рдЦрд╛рдИ рджреЗ рд░рд╣рд╛ рд╣реИ рд╡рд╣ рд▓рдХрдбрд╝рд╣рд╛рд░рд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╣реИред рдореИрдВрдиреЗ рдЬрд╛рдирдмреВрдЭрдХрд░ рдЙрдкрд╕рд░реНрдЧ рдирд╣реАрдВ рдЬреЛрдбрд╝рд╛ рдерд╛ред рдореИрдВ рдЗрд╕рдореЗрдВ рд╕реЗ рдХреБрдЫ рддрд░реАрдХреЗ рджреВрдВрдЧрд╛ред
public interface Logger {
рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рддрд░реАрдХреЗ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛рдУрдВ рд╕реЗ рдмрдВрдзреЗ рдирд╣реАрдВ рд╣реИрдВ, рдХреЗрд╡рд▓ рдЪреЗрддрд╛рд╡рдиреА рдХреЗ рд╕реНрддрд░ рдФрд░ рдЙрдЪреНрдЪрддрд░ рд╣реИрдВред
рдЖрдЧреЗ, рдореИрдВ рджрд┐рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд▓рдХрдбрд╝рд╣рд╛рд░реЗ рдХреА рдХрдХреНрд╖рд╛ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реВрдВрдЧрд╛ред рдХреЙрд▓рд┐рдВрдЧ рдереНрд░реЗрдб рд╕реЗ рд▓рдХрдбрд╝рд╣рд╛рд░рд╛ рджреНрд╡рд╛рд░рд╛ рд▓рд┐рдП рдЧрдП рдкреНрд░рджрд░реНрд╢рди рдХрд╛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдиреНрдпреВрдирддрдо рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╡реИрд╕реЗ, рд▓рдХрдбрд╝рд╣рд╛рд░рд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рдПрдХ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рд╕рдВрд╕реНрдХрд░рдг рд╣реИ, рдЬреЛ рдмрд╛рд╣рд░ рд╕реЗ рджрд┐рдЦрд╛рдИ рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИ, рд╕реЗрдЯрд▓реЗрд╡рд▓ рд╡рд┐рдзрд┐ рдХреЛ рдЬреЛрдбрд╝рддрд╛ рд╣реИред
class CheckingLogger : InternalLogger { bool[] levels = new bool[LogLevel.Total]; Sender send; string category; public CheckingLogger(string category, Sender sender, int level) { this.send = sender; this.category = category; SetLevel(level); } public void SetLevel(int level) { for (int n = LogLevel.Fatal; n < LogLevel.Total; n++) { levels[n] = (n <= level); } } public void Error(string message, Exception ex = null) { if (levels[LogLevel.Error]) { send(new LogItem(category, LogLevel.Error, message, ex: ex)); } }
рдПрдХ рд╕реНрдкреИрдорд┐рдВрдЧ рд╡рд┐рдзрд┐ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рдпрд╣ рд╕рд░рдгреА рд╕реЗ рдмреВрд▓рд┐рдпрди рдорд╛рди рдХреА рдЬрд╛рдБрдЪ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рдкреНрд░реЗрд╖рдХ рдкреНрд░рддрд┐рдирд┐рдзрд┐ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рднреЗрдЬрддрд╛ рд╣реИред рд▓рдХрдбрд╝рд╣рд╛рд░рд╛ рдХрд╛ рджреВрд╕рд░рд╛ рд╕рдВрд╕реНрдХрд░рдг рдмреВрд▓рд┐рдпрди рд╕рд░рдгреА рдХреЗ рдмрдЬрд╛рдп рдкреНрд░реЗрд╖рдХреЛрдВ рдХреА рдПрдХ рд╕рд░рдгреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдПрдХ рдЦрд╛рд▓реА рд╡рд┐рдзрд┐ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░рддрд┐рдирд┐рдзрд┐ рдХреЛ рдСрдл рд╕реНрддрд░ рдореЗрдВ рдбрд╛рд▓рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рднреЗрдЬрдиреЗ рдХреА рд╡рд┐рдзрд┐ рдореЗрдВ рдХреЛрдИ рдЬрд╛рдВрдЪ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ, рддреБрд░рдВрдд рднреЗрдЬрдирд╛ред рдкрд░реАрдХреНрд╖рдг рдХреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдкреНрд░рджрд░реНрд╢рди рдореЗрдВ рдЕрдВрддрд░ рдирдЧрдгреНрдп рд╣реИ, рд╢рд╛рдпрдж рд╡рд┐рднрд┐рдиреНрди рдкреНрд▓реЗрдЯрдлрд╛рд░реНрдореЛрдВ рдкрд░ рдкрд░реАрдХреНрд╖рдг рдПрдХ рдЬрд╡рд╛рдм рджреЗрдВрдЧреЗред рд▓рдХрдбрд╝рд╣рд╛рд░рд╛ рдкрд░реАрдХреНрд╖рдг рдХрд╛рдлреА рд╕рд░рд▓ рд╣реИ, рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╛рдБрдЪрддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рд╕рдВрджреЗрд╢ рдкреНрд░реЗрд╖рдХ рдХреЗ рдкрд╛рд╕ рдЧрдпрд╛ рд╣реИ, рдЙрд╕реЗ рдХрдм рдЪрд╛рд╣рд┐рдП рдФрд░ рдХрдм рдирд╣реАрдВред рдлрд┐рд░ рдореБрдЭреЗ рдЯрд╛рдЗрдкреЛ рдФрд░ рдХреЙрдкреА-рдкреЗрд╕реНрдЯ рдХреА рдЧрд▓рддрд┐рдпрд╛рдБ рднреА рдЖрдИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдмрд╣реБрдд рд╕рд╛рд░реЗ рд╕рдорд╛рди рддрд░реАрдХреЗ рд╣реИрдВ, рдЕрдВрддрд░ рд╕рд░рд╕рд░реА рдирдЬрд╝рд░ рд╕реЗ рдирд╣реАрдВ рджрд┐рдЦрддрд╛ рд╣реИред
рдореИрдВ рдХрдХреНрд╖рд╛ рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рд╕ рдЕрдиреБрднрд╛рдЧ рдХреЗ рд╕рд╛рде рдЖрдпрд╛ рдерд╛, рдпрд╛ рдмрд▓реНрдХрд┐, LogItem рд╕рдВрд░рдЪрдирд╛ рдЬреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд▓реЙрдЧ рдХреЛ рдкреНрд░рд╕рд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рддреА рд╣реИ; рдореИрдВ рдпрд╣рд╛рдБ рджреЗ рд░рд╣рд╛ рд╣реВрдБ, рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЛ рдЫреЛрдбрд╝ рдХрд░, рдХреЗрд╡рд▓ рд╕рд╛рдордЧреНрд░реАред рдЗрд╕рдореЗрдВ рд╕реЗ, рд╡реИрд╕реЗ, рдпрд╣ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдПрдХ рд╕рдВрджреЗрд╢ рдХреЗ рд▓рд┐рдП рдЖрдИрдбреА рдХреЛ рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рдХреЗ рд▓рд┐рдП рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдпрд╣ рдпрд╛ рддреЛ рдкреНрд░рд╕рд╛рд░рдг рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рдпрд╛, рдХреЙрд▓ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рджреЛ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛рдУрдВ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП: рдХреЙрд▓ рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдФрд░ рдХреЙрд▓ рдХрд╛ рдЬрд╡рд╛рдм рджреЗрдиреЗ рд╡рд╛рд▓рд╛ред рдкрд┐рдЫрд▓реА рдХрдХреНрд╖рд╛рдУрдВ рдХреЗ рддрд░реАрдХреЛрдВ рдХреЛ рдЗрд╕ рдЙрджреНрджреЗрд╢реНрдп рдХреЗ рд▓рд┐рдП рджреЛрд╣рд░рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдХреЗрд╡рд▓ рдзреНрдпрд╛рди рд╕реЗ рд╡рдВрдЪрд┐рддред
struct LogItem { public readonly String category; public readonly String message; public readonly int[] ids; public readonly int level; public readonly Exception ex; public readonly DateTime time; }
рдирд┐рд░реНрднрд░рддрд╛ рдЗрдВрдЬреЗрдХреНрд╢рди
рдЗрд╕ рдЦрдВрдб рдореЗрдВ, рдореИрдВ рдПрдХ IoC рдХрдВрдЯреЗрдирд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рджреВрдВрдЧрд╛ред рдЕрдЧрд▓реА рдкрдВрдХреНрддрд┐ рдореЗрдВ рд▓рдХрдбрд╝рд╣рд╛рд░рд╛ рд╡рд░реНрдЧ рд╣реИред рдирд╛рдо IoC рдХрдВрдЯреЗрдирд░ рд╕реЗ рдЬреБрдбрд╝рд╛ рдирд╣реАрдВ рд╣реИ, рдпрд╣ рд╕рд┐рд░реНрдл рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИред рдпрд╣ GetLogger рд╡рд┐рдзрд┐ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рдЬрд╣рд╛рдБ LogAccess рд╡рд░реНрдЧ рд╡рд┐рдзрд┐ рдЕрдиреБрдорд╛рдирд┐рдд рд╣реИред рдХреЛрдб рдореЗрдВ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП, NLog, рдЧрд╛рд░рдВрдЯреА рдирд╣реАрдВ рджреЗрддрд╛ рдХрд┐ рдПрдХ рд╣реА рд╢реНрд░реЗрдгреА рдХреЗ рд╕рд╛рде GetLogger рд╡рд┐рдзрд┐ рдирд╛рдордХ рджреЛ рдмрд╛рд░ рдПрдХ рд╣реА рд▓рдХрдбрд╝рд╣рд╛рд░рд╛ рдЙрджрд╛рд╣рд░рдг рджреЗрдЧрд╛ред рдореИрдВрдиреЗ рд╕реЛрдЪрд╛ рдФрд░ рддрдп рдХрд┐рдпрд╛ рдХрд┐ рдпрд╣ рддрд░реАрдХрд╛ рдЕрдбрд╝рдЪрди рдирд╣реАрдВ рд╣реЛрдЧрд╛, рдФрд░ рдЗрд╕ рдкрд░ рд╕рд╛рдорд╛рдиреНрдп рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди рд╕реЗрдЯ рдХрд░реЗрдВ, рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдЙрджрд╛рд╣рд░рдг рдХреА рдЧрд╛рд░рдВрдЯреА рджреА рдЬрд╛рдиреА рдЪрд╛рд╣рд┐рдПред рд▓реЙрдЧ рдХрдВрдЯреЗрдирд░ рд╕рднреА рдкрд╣рд▓реЗ рд╕реЗ рддреИрдпрд╛рд░ рдХрд┐рдП рдЧрдП рд▓реЙрдЧрд░ рдХреЛ рд╕реНрдЯреЛрд░ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдПрдХ рд╕реЗрдЯрд▓реЗрд╡рд▓ рд╡рд┐рддрд░рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рд▓реЙрдЧрдСрдХ рд╕реЗ рдЕрдиреБрдорд╛рдирд┐рдд рднреА рд╣реИред
рдЗрд╕рд▓рд┐рдП, рд╣рдо рдПрдХ IoC рдХрдВрдЯреЗрдирд░ рдмрдирд╛рддреЗ рд╣реИрдВ, рдЖрдЧреЗ рдХреА рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рджреЛ рд▓рд╛рдЗрдиреЛрдВ рдХреЗ рдмреАрдЪ рд░рдЦрд╛ рдЧрдпрд╛ рд╣реИ:
var builder = new ContainerBuilder(); IContainer container = builder.Build();
рдКрдкрд░ рд╕реЗ, рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рд╡рд░реНрдЧ рдПрдХ рд╕рд┐рдВрдЧрд▓рдЯрди рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрд╣ рдХрд╛рдлреА рд╕рд░рд▓рддрд╛ рд╕реЗ рд╣рд╛рд╕рд┐рд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:
builder .RegisterType<LoggerContainer>() .SingleInstance();
рдФрд░ рдЕрдЧрд▓реА рд╡рд┐рдзрд┐, рд╣рдо рдЕрдкрдиреЗ рд╕рд┐рдВрдЧрд▓рдЯрди рдХреЗ рд▓рд┐рдП рдПрдХ рд▓рд┐рдВрдХ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
Container .Resolve<LoggerContainer>();
рддрд╛рдХрд┐ рд▓реЙрдЧ рдХрдВрдЯреЗрдирд░ рдЦреБрдж IoC рдХрдВрдЯреЗрдирд░ рдХреА рд╕реЗрд╡рд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХреЗ, рдЬрд╣рд╛рдВ рд╕реЗ рдЗрд╕реЗ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛, рдореИрдВрдиреЗ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдореЗрдВ рдЗрд╕реЗ IComponentContext рдкреИрд░рд╛рдореАрдЯрд░ рдЬреЛрдбрд╝рд╛ред рдпрд╣ рдЖрдкрдХреЛ рдмрд╛рд╣рд░ рдХреА рдХрдХреНрд╖рд╛ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рдиреЗ рдФрд░ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХрдХреНрд╖рд╛рдУрдВ рдХреЛ рдмрджрд▓рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рд╡рд╛рд▓реЗ рдХрдХреНрд╖рд╛рдУрдВ рдореЗрдВ, рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЧрдП рдХреЛрдб рдХреЛ рдмрджрд▓реЗ рдмрд┐рдирд╛, рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЛ рдмрджрд▓рдХрд░, рд╕рд╣рд┐рдд рдХреЛрдб рдореЗрдВ рдмрд┐рд▓реНрдХреБрд▓ рд╕реЗрдЯ рдирд╣реАрдВ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИ, рд▓реЗрдХрд┐рди xml рд╕реЗ рд▓реЛрдб рдХрд░рдирд╛ рд╣реИред рджрд░рдЕрд╕рд▓, рдмрд╛рд╣рд░реА рдирд┐рд░реНрдорд╛рдг рдХреЗ рд╕рд╛рде рдЖрдВрддрд░рд┐рдХ рдирд┐рд░реНрдорд╛рдг рдХреЗ рдЗрд╕ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рдХреЛ рдирд┐рд░реНрднрд░рддрд╛ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рджрд░рдЕрд╕рд▓, рдПрдХ рд╡рд┐рдзрд┐ рдЬреЛ рд╕рдВрджрд░реНрдн рд╕реЗ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд▓рдХрдбрд╝рд╣рд╛рд░рд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреА рд╣реИ:
private InternalLogger CreateLogger(string category) { return context .Resolve<InternalLogger>(new NamedParameter[]{ new NamedParameter("category", category), new NamedParameter("level",LogLevel.Default) }); }
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣ рдЙрджрд╛рд╣рд░рдг рджрд┐рдЦрд╛рддрд╛ рд╣реИ рдХрд┐ рдХреЙрд▓ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХреА рдЬрдЧрд╣ рд╕реЗ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╡рд░реНрдЧ рдХреИрд╕реЗ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдП, рди рдХрд┐ рдХрдВрдЯреЗрдирд░ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдореЗрдВ, рдЬреЛ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдкрд┐рдЫрд▓реЗ рдорд╛рдорд▓реЗ рдХреА рддрд░рд╣ рд╕рд░рд▓ рдмрдирд╛ рд░рд╣реЗред рдЕрдВрддрд░ рдХреЗрд╡рд▓ рдЗрддрдирд╛ рд╣реИ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рд╕рд┐рдВрдЧрд▓рдЯрди рдирд╣реАрдВ рд╣реИ рдФрд░ рдПрдХреНрд╕реЗрд╕ рдкреЙрдЗрдВрдЯ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╣реИ, рди рдХрд┐ рдХреЗрд╡рд▓ рдХреНрд▓рд╛рд╕ред builder .RegisterType<CheckingLogger>() .As<InternalLogger>();
рдпрд╣рд╛рдБ рдЖрдк рдХреБрдЫ рдирдХрд╛рд░рд╛рддреНрдордХ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рдореИрдВ рдЖрдЧреЗ рд░рд╣рдирд╛ рдирд╣реАрдВ рдЬрд╛рдирддрд╛, рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкрд░ рдЯрд┐рдкреНрдкрдгреА рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдпрд╣ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдХрд┐рд╕реА рд╡рд┐рд╢реЗрд╖ рд╡рд░реНрдЧ рдХреЗ рдирд┐рд░реНрдорд╛рддрд╛ рдореЗрдВ рдирд╛рдо рдФрд░ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЗрдирдкреБрдЯ рдкреИрд░рд╛рдореАрдЯрд░ рдХреНрдпрд╛ рдореМрдЬреВрдж рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдПред рд╣рд╛рд░реНрдб-рдЯреВ-рдбрд╛рдпрдЧреНрдиреЛрд╕рд┐рд╕ рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдЬреЛ рдХрдВрдкрд╛рдЗрд▓рд░ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд░реЗрдЧрд╛, рдмрд╕ рд╣реЛрдиреЗ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдХрдВрдЯреЗрдирд░ рдХреЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЛ рдмрджрд▓рддреЗ рд╣реБрдП, рдЖрдк рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рдЬрд╛рдирддреЗ рд╣реЛрдВрдЧреЗ, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рд╕рдВрджрд░реНрднреЛрдВ рдХреА рдЦреЛрдЬ рдХрд░рдиреА рд╣реЛрдЧреАред рд╕рдВрднрд╡рддрдГ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ "рдХреНрд▓рд╛рд╕рд┐рдХ" рдХрд╛рд░рдЦрд╛рдиреЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реИредрдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЖрдИрдУрд╕реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреНрдпрд╛ рджреЗрддрд╛ рд╣реИ: рдЗрдХрд╛рдИ рдкрд░реАрдХреНрд╖рдг рдХреЗ рджреМрд░рд╛рди рдХрдВрдЯреЗрдирд░ред рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП, рдЖрдк рдЕрдкрдирд╛ рдХрдВрдЯреЗрдирд░ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ: [TestClass()] public class LoggerContainerTest { IContainer testContainer; public LoggerContainerTest() { var builder = new ContainerBuilder(); builder .Register<LoggerContainer>((c, p) => new LoggerContainer(c.Resolve<IComponentContext>())); builder .RegisterType<LoggerMock>() .As<InternalLogger>(); testContainer = builder.Build(); }
рдпрд╣рд╛рдВ рдПрдХ рдФрд░ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЛ рдЪрд┐рддреНрд░рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЬреЛ рдСрдЯреЛрдлреЗрдХ рдореЗрдВ рд╣реИ, рдпрд╣ рдЖрдкрдХреЛ рдЕрдЪреНрдЫреЗ рдкреБрд░рд╛рдиреЗ рдирдП рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм рд░рд┐рдЬрд╝реЙрд▓реНрдпреВрд╢рди, рдЬреЛ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдЬрд╝рд╛рд╣рд┐рд░ рд╣реИ, рдкреНрд░рддрд┐рдмрд┐рдВрдм рд╕реЗ рдмрд╣реБрдд рддреЗрдЬ рд╣реИредрдпрд╣ рдкрд░реАрдХреНрд╖рдг рд╡рд┐рдзрд┐рдпреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХрд╛ рдПрдХ рдЯреБрдХрдбрд╝рд╛ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛ рд╣реБрдЖ рд╣реИред LoggerContainer lc= testContainer .Resolve<LoggerContainer>(); var logger1 = lc.GetLogger(cat1); var logger2 = lc.GetLogger(cat2); var logger3 = lc.GetLogger(cat1); Assert.AreEqual(logger1, logger3); Assert.AreNotEqual(logger1, logger2);
Moq рдЯреЗрд╕реНрдЯ рдлреНрд░реЗрдорд╡рд░реНрдХ
рдПрдХ рдФрд░ рдЙрдкрдпреЛрдЧреА рддрдХрдиреАрдХ рдЬреЛ рд▓реЗрдЦрди рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЛ рдЖрд╕рд╛рди рдмрдирд╛рддреА рд╣реИред рдореИрдВ рдЗрд╕рдХреЗ рдЖрд╡реЗрджрди рдХреЛ рдирд┐рдореНрди рд╡рд░реНрдЧ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдкрд░ рджрд┐рдЦрд╛рдКрдВрдЧрд╛, рдЬрд┐рд╕реЗ рдореИрдВрдиреЗ рдПрдХ рд▓рдХрдбрд╝рд╣рд╛рд░рд╛ рдпрд╛ LogCollector рдХрд╣рд╛ рдерд╛ред рдпрд╣ рд╕реНрдЯреНрд░реАрдо рднреЗрдЬрдиреЗ рдХреЗ рд╕рд╛рде рдбреАрдХреЛрдкрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдЙрд╕реА IQueued рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рджреНрд╡рд╛рд░рд╛ рдлрд╝рд┐рд▓реНрдЯрд░рд┐рдВрдЧ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рджреВрд╕рд░реА рдирд┐рд░реНрднрд░рддрд╛ рдореЗрдВ рдПрдХ рд╡рд░реНрдЧ рд╣реЛрддрд╛ рд╣реИ рдЬреЛ рдПрдХ рдлрд╛рдЗрд▓ рдкрд░ рд▓рд┐рдЦрддрд╛ рд╣реИ рдФрд░ рдШреВрдорддрд╛ рд╣реИредрдореИрдВ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд╡рд░реНрдгрди рдирд╣реАрдВ рдХрд░реВрдВрдЧрд╛ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд╕рдм рдХреБрдЫ рдХрд╛рдлреА рд╕рд░рд▓ рдФрд░ рд╕реНрдкрд╖реНрдЯ рд╣реИ, рдореИрдВ рдПрдХ рдЕрдиреНрдп рд╡рд░реНрдЧ рдкрд░ рд╕рд╛рдорд╛рдиреНрдп рд╢рдмреНрджреЛрдВ рдореЗрдВ рд▓рд┐рдЦреВрдВрдЧрд╛, рдЬреЛ рдПрдХ рдлрд╝рд╛рдЗрд▓ рдкрд░ рд▓рд┐рдЦрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, LogItem рд╕реЗ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рддрд╛ рд╣реИред рдореИрдВрдиреЗ рдЗрд╕реЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдмрдирд╛рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛, рдЗрд╕ рддрд░рд╣ рдХреА рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд▓рдВрдмреЗ рд╕рдордп рд╕реЗ рджрд┐рд▓рдЪрд╕реНрдк рд╣реИредNLog рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдЙрджрд╛рд╣рд░рдг: рд▓реЗрдЖрдЙрдЯ = "$ {longdate} $ {рдЕрдкрд░рдХреЗрд╕: $ {рд╕реНрддрд░}} $ {рд╕рдВрджреЗрд╢}"редрдФрд░ рдореЗрд░реЗ рд▓рдХрдбрд╝рд╣рд╛рд░реЗ LogMessageFormat = \ d \ l \ m \ r \ n рдХрд╛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдЙрджрд╛рд╣рд░рдгредрдпрд╣ рдмрд┐рд▓реНрдХреБрд▓ рдЙрд╕реА рд░реВрдк, рджрд┐рдирд╛рдВрдХ, рд╕реНрддрд░, рд╕рдВрджреЗрд╢ рдФрд░ рд▓рд╛рдЗрди рдлрд╝реАрдб рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛрддрд╛ рд╣реИред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЕрдиреБрдХреВрд▓рд┐рдд рдЖрдЙрдЯрдкреБрдЯ рдкреНрд░рд╛рд░реВрдк рддрд╛рдХрд┐ рдЖрдк рд╕реАрдзреЗ рдкреНрд░рджрд░реНрд╢рди рдХреА рддреБрд▓рдирд╛ рдХрд░ рд╕рдХреЗрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣ рдЗрд╕ рдкрдВрдХреНрддрд┐ рдореЗрдВ рдерд╛ рдХрд┐ рдореИрдВрдиреЗ рдЗрди рд╕рднреА рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛рдУрдВ рдХреЗ рдмреАрдЪ рдПрдХ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛, рдЗрд╕рдХреЗ рд╕реНрдЯреИрдХ рдЯреНрд░реЗрд╕ рдХреЗ рд╕рд╛рде рдПрдХ рдЕрдкрд╡рд╛рдж рдФрд░, рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ, рдордирдорд╛рдиреА рд▓рд╛рдЗрдиреЛрдВ рдХреЛ рдЬреЛрдбрд╝рдирд╛ рд╕рдВрднрд╡ рдмрдирд╛ рджрд┐рдпрд╛ред рдирд┐рд░реНрдорд╛рдг рдПрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдореЗрдВ рдЖрдЧреЗ рдмрдврд╝рддрд╛ рд╣реИ, рдкреНрд░рддреНрдпреЗрдХ рдмрд╛рдж рдХрд╛ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рд╕рдВрджреЗрд╢ рдХреЗ рдЕрдкрдиреЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЛ рд╕рдВрдЪрд╛рд░рд┐рдд LogItem рд╕реЗ StringBuilder рдореЗрдВ рдлреЗрдВрдХрддрд╛ рд╣реИред рдорд╛рд╕реНрдЯрд░ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рддреЗ рд╕рдордп рдЪреЗрди рдПрдХ рдмрд╛рд░ рдмрдирддреА рд╣реИредрдХрдХреНрд╖рд╛ рдХрд╛ рдореБрдЦреНрдп рдХрд╛рд░реНрдп рдХрд╛рдлреА рд╕рд░рд▓ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЙрд╕ рдХреЛрдб рдХреЛ рдирд╣реАрдВ рджреВрдВрдЧрд╛ рдЬреЛ рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ, рдореИрдВ рдлрд╝рд┐рд▓реНрдЯрд░рд┐рдВрдЧ рдкрд░ рдереЛрдбрд╝рд╛ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░реВрдВрдЧрд╛ред рдЪреВрдВрдХрд┐ рдПрдХ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди рдХрд╛рд░реНрдп рднреА рд╣реИ, рдЕрд░реНрдерд╛рдд, рдПрдХ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдпрд╛ рд╣рдЯрд╛рдиреЗ рд╡рд╛рд▓рд╛ рдПрдХ рд╡рд┐рдзрд┐ рдХреЙрд▓ рджреВрд╕рд░реЗ рдзрд╛рдЧреЗ рд╕реЗ рдЖрддрд╛ рд╣реИред рдПрдХ рддрд░реАрдХрд╛ рд╣реИ - рд╕реВрдЪреА рдХреЛ рдмреНрд▓реЙрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ, рдпрд╛ рд╣рд╛рд╢рд╕реЗрдЯ, рдкреНрд░рджрд░реНрд╢рди рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░реЗрдЧрд╛ред рдореИрдВрдиреЗ рдереЛрдбрд╝рд╛ рдЕрд▓рдЧ рд░рд╛рд╕реНрддрд╛ рдЕрдкрдирд╛рдпрд╛, рдореИрдВрдиреЗ рднреА рд▓рдВрдмреЗ рд╕рдордп рд╕реЗ рдЗрд╕ рддрд░рд╣ рдХреЗ рдЕрд╡рд╕рд░ рдХреЛ рднрд╛рд╖рд╛ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рдерд╛ рдФрд░ рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрдкрдпреЛрдЧ рдЦреЛрдЬрдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ред рд╕рдорд╛рдзрд╛рди рдХрд╛ рд╕рд╛рд░ рдПрдХ рдЧреИрд░-рдЕрд╡рд░реБрджреНрдз рдХрддрд╛рд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдПрдХ рдЕрдирд╛рдо рдПрдХреНрд╢рди рд╡рд┐рдзрд┐ рдкрд╛рд░рд┐рдд рдХрд░рдирд╛ рд╣реИред filterQue = рдирдпрд╛ рд╕рдорд╡рд░реНрддреА queueue <Action <HashSet >> ();рдкреНрд░рддреНрдпреЗрдХ рдлрд╝рд┐рд▓реНрдЯрд░рд┐рдВрдЧ рдкреНрд░рдпрд╛рд╕ рдореЗрдВ, рдлрд╝рд┐рд▓реНрдЯрд░рд┐рдВрдЧ рд╡рд┐рдзрд┐ рдпрд╣ рдЬрд╛рдВрдЪрддреА рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдХрддрд╛рд░ рдЦрд╛рд▓реА рд╣реИ, рдЬрд┐рд╕реЗ рдореЙрдирд┐рдЯрд░ рдХреЛ рдХреИрдкреНрдЪрд░ рдХрд░рдиреЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рддреЗрдЬреА рд╕реЗ рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рдпрджрд┐ рдпрд╣ рдЦрд╛рд▓реА рдирд╣реАрдВ рд╣реИ, рддреЛ рдпрд╣ рд▓реЙрдЧрд░ рд╕реНрдЯреНрд░реАрдо рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рд╡рд┐рдзрд┐ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддрд╛ рд╣реИред Action<HashSet<int>> refresh; while (!filterQue.IsEmpty) { if (filterQue.TryDequeue(out refresh) && refresh != null) { refresh(filter); } }
рдХреЙрд▓рд┐рдВрдЧ рд╡рд┐рдзрд┐, рд╕реЗрдЯ рдХреЛ рд╕реАрдзреЗ рдПрдХреНрд╕реЗрд╕ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп, рд╡рд╛рдВрдЫрд┐рдд рдкреНрд░рддрд┐рдирд┐рдзрд┐ рдХреЛ рдХрддрд╛рд░ рдореЗрдВ рд░рдЦрддреА рд╣реИред filterQue.Enqueue((x)=> { x.Add(id); });
Moq рдкрд░ рд╡рд╛рдкрд╕ рд▓реМрдЯрдирд╛ - рдЙрдкрд░реЛрдХреНрдд рд╡рд░реНрдЧреЛрдВ рдореЗрдВ рдореИрдВрдиреЗ рдЦреБрдж рдХреЛ рдореЛрдХрд╛рд╕ рдмрдирд╛рдпрд╛, рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЕрддрд┐рд░рд┐рдХреНрдд рдХреЛрдб рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдФрд░ рдЕрд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдмрджрд╕реВрд░рдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЦрд╛рд╕рдХрд░ рдЬрдм рдЖрдкрдХреЛ рдХреЗрд╡рд▓ рдХрдХреНрд╖рд╛ рд╡рд┐рдзрд┐ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред Moq рдЖрдкрдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдПрдХ рд╡рд░реНрдЧ рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдЬреЛ рдпрд╛ рддреЛ рджрд┐рдП рдЧрдП рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ рдпрд╛ рдХрд┐рд╕реА рджрд┐рдП рдЧрдП рд╡рд░реНрдЧ рдХреЛ рд╕рднреА рдЖрднрд╛рд╕реА рддрд░реАрдХреЛрдВ рдХреЗ рдУрд╡рд░рд░рд╛рдЗрдб рдХреЗ рд╕рд╛рде рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рджреЗрддрд╛ рд╣реИред рдпрд╣рд╛рдВ рдкреНрд░рддрд┐рдмрдВрдз рддреБрд░рдВрдд рд╕реНрдкрд╖реНрдЯ рд╣реИ - рдЖрдк рдЧреИрд░-рдЖрднрд╛рд╕реА рддрд░реАрдХреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рд╡рд░реНрдЧ рдкрд░ рдПрдХ рдирдХрд▓реА рдирд╣реАрдВ рдмрдирд╛ рд╕рдХрддреЗред рд▓реЗрдХрд┐рди, рдЬреИрд╕рд╛ рдХрд┐ GoF рд╣рдорд╛рд░реЗ рдЕрдзреАрди рд╣реИ, рд╣рдореЗрдВ "рдЗрдВрдЯрд░рдлрд╝реЗрд╕" рдХреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЕрд░реНрдерд╛рдд, рдпрд╣ рд╡рд╛рдВрдЫрдиреАрдп рд╣реИ рдХрд┐ рд╕рднреА рд╡рд░реНрдЧ рдЗрд╕рдХреЗ рд╕рд╛рде рд╕реБрд╕рдЬреНрдЬрд┐рдд рд╣реЛрдВ, рдЬреЛ рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рд╣рдореЗрдВ рдЙрдкрд░реЛрдХреНрдд рд╕рднреА рддрдХрдиреАрдХреЛрдВ рдФрд░ рддрдХрдиреАрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдЬреЛ рдЗрд╕реЗ рдЖрд╕рд╛рди рдмрдирд╛рддрд╛ рд╣реИ рдФрд░ рдЪрд┐рдЯреЛрд▓реА, рд╡рд┐рдХрд╛рд╕ рдХреЛ рдФрдкрдЪрд╛рд░рд┐рдХ рдмрдирд╛рддрд╛ рд╣реИред рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░редMoq рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдПрдХ рдФрд░ рдмрд╛рд░реАрдХрд┐рдпреЛрдВ рдХреА рдЬрд╛рдБрдЪ рдХрд░рддреЗ рд╕рдордп рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдХреБрдЫ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рд╕реНрдЯреВрдбрд┐рдпреЛ рдЦреБрдж рд╡рд┐рдзрд╛рдирд╕рднрд╛ рдореЗрдВ рдПрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХрд╛ рдкрд░рд┐рдЪрдп рджреЗрддрд╛ рд╣реИ рдЬреЛ рдкрд░реАрдХреНрд╖рдг рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреА рд╡рд┐рдзрд╛рдирд╕рднрд╛ рд╕реЗ рдЖрдВрддрд░рд┐рдХ рдХрдХреНрд╖рд╛рдУрдВ рддрдХ рдкрд╣реБрдВрдЪ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдХрднреА-рдХрднреА рдЖрдкрдХреЛ рдЗрд╕реЗ рд╕реНрд╡рдпрдВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдФрд░ Moq рдХреЗ рд▓рд┐рдП рднреА рдХрдХреНрд╖рд╛рдУрдВ рдФрд░ рдЗрдВрдЯрд░рдлреЗрд╕ рддрдХ рдкрд╣реБрдВрдЪ рд╣реЛрддреА рд╣реИред рдЬрд┐рд╕реЗ рдЖрдкрдХреЛ рдЕрдиреБрдХрд░рдг рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЖрдкрдХреЛ рдЙрд╕рдХреЗ рд▓рд┐рдП рдкрд╣реБрдБрдЪ рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛ред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ AssemblyInfo.cs рдлрд╝рд╛рдЗрд▓ рдвреВрдВрдвреЗрдВ рдФрд░ рд▓рд╛рдЗрди рдЬреЛрдбрд╝реЗрдВ рдпрд╛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░реЗрдВ рддрд╛рдХрд┐ рдпрд╣ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦреЗ: [assembly: System.Runtime.CompilerServices.InternalsVisibleTo("LoggerTest"), System.Runtime.CompilerServices.InternalsVisibleTo("DynamicProxyGenAssembly2")]
рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдкрд╣рд▓реА рдЪреАрдЬ рдХрд▓реЗрдХреНрдЯрд░ рдХреЛ рдкреНрд░рд╛рдкреНрдд рд╕рдВрджреЗрд╢ рдХреЛ рдкрд╛рд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИ рдЬреЛ рдереНрд░реЗрдб рдбрд┐рдХреЙрдкреНрд▓рд┐рдВрдЧ рдмрдирд╛рддрд╛ рд╣реИредрдореЛрдХ рдиреЗ рд╕рдВрджреЗрд╢ рдХреЛ рд╕реНрд╡рдпрдВ рдирд╣реАрдВ рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдХреЗрд╡рд▓ рдЗрд╕ рд╡рд░реНрдЧ рдХреЗ рд╕рд╛рде рдЖрдЧреЗ рдФрд░ рдкреАрдЫреЗ рдЧреБрдЬрд░рддрд╛ рд╣реИ, рдФрд░ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рд╕рдВрдкрд░реНрдХ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рдХреЗ рддрд░реАрдХреЛрдВ рдХреЛ рдирд╣реАрдВ рдХрд╣рддрд╛ рд╣реИ, рдЗрд╕рдХреЗ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЛ рдирд╣реАрдВ рдкрдврд╝рддрд╛ рд╣реИред LogItem message = new LogItem(category, level, msg, ids, GetException()); var qThread = new Mock<IQueued<LogItem>>(MockBehavior.Strict); var writer = new Mock<ILogWriter>(MockBehavior.Strict); qThread .Setup(s => s.Send(It.IsAny<LogItem>())); writer .Setup(s => s.GetTimeout()) .Returns(timeout); qThread .Setup(s => s.SetTimeout(It.IsAny<int>())); LogCollector target = new LogCollector(qThread.Object, writer.Object); qThread .Verify(s => s.SetTimeout(It.Is<int>(a => a == timeout))); target.Send(message); qThread .Verify(s => s.Send(It.Is<LogItem>(i => i.Equals(message))), Times.Once()); }
рдорд╛рдорд▓реЗ рдореЗрдВ рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ: рдкрд╣рд▓реА рджреЛ рдкрдВрдХреНрддрд┐рдпрд╛рдВ рдЙрдирдХреЗ рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрднрд░рддрд╛ рдХреЗ tattors рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рдИ рдЧрдИ рд╣реИрдВред рд╕рдЦреНрдд рдкреИрд░рд╛рдореАрдЯрд░ рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдореЛрдХ рдПрдХ рдЕрдкрд╡рд╛рдж рдлреЗрдВрдХ рджреЗрдЧрд╛ рдпрджрд┐ рдХрдХреНрд╖рд╛рдПрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдирд╣реАрдВ рдХрд┐рдП рдЧрдП рддрд░реАрдХреЛрдВ рдХреЛ рдХреЙрд▓ рдХрд░рддреА рд╣реИрдВ, рдЬрд┐рд╕рд╕реЗ рдкрд░реАрдХреНрд╖рдг рдлрд╝реНрд▓рд┐рдк рд╣реЛ рдЬрд╛рддрд╛ рд╣реИредрдЕрдЧрд▓реА рдХреЙрд▓ рдореЗрдВ IQueued рдореЙрдХ рдХреА рд╡рд┐рдзрд┐ рднреЗрдЬреЗрдВ, рдпрд╣ рджрд░реНрд╢рд╛рддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдкрд░реАрдХреНрд╖рдг рдХреЗ рджреМрд░рд╛рди рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдпрд╣рд╛рдВ рдЖрдк рдкреВрд░реНрд╡-рд╢рд░реНрддреЗрдВ рднреА рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдпрджрд┐ рдХрдИ рд╡рд┐рдзрд┐рдпрд╛рдБ рд╣реИрдВ, рддреЛ рдкрд░реАрдХреНрд╖рдг рдХреЗ рдмрд╛рдж рдЖрдк VerifyAll () рдкрд░ рдХреЙрд▓ рдХрд░рдХреЗ рд╕рднреА рдкреВрд░реНрд╡ рд╢рд░реНрдд рдЬрд╛рдБрдЪ рд╕рдХрддреЗ рд╣реИрдВред рдореИрдВ рдкрд░реАрдХреНрд╖рдг рдХрд╛ рдПрдХ рд╡рд┐рд╕реНрддреГрдд, рдирд┐рд░рд░реНрдердХ рд╡рд┐рд╡рд░рдг рдкрд░ рдмрд╕ рдЧрдпрд╛ред рдЕрдЧрд▓реА рдкрдВрдХреНрддрд┐ рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдЧреЗрдЯрдЯрд╛рдЗрдордЖрдЙрдЯ рд╡рд┐рдзрд┐ рдХреЛ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рдореЛрдХреВ рдХреЛ рдпрд╣ рднреА рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдЗрд╕реЗ рд╡рд╛рдкрд╕ рд▓реМрдЯрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЕрдЧрд▓реА рдкрдВрдХреНрддрд┐ рднреА SetTimeout рдкрджреНрдзрддрд┐ рдХреЛ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░рддреА рд╣реИредрдЕрдЧрд▓рд╛, рд╣рдо рдХрд▓реЗрдХреНрдЯрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рддреЗ рд╣реИрдВ, рдФрд░ рдЗрд╕реЗ рдЗрд╕рдХреА рдирд┐рд░реНрднрд░рддрд╛ рдЦрд┐рд▓рд╛рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдХреЗ рдмрд╛рдж рд╣рдо рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдХрд▓реЗрдХреНрдЯрд░ рдиреЗ рдПрдХ рдирд┐рд░реНрднрд░рддрд╛ рдкрд░ рдЧреЗрдЯрдЯрд╛рдЗрдордЖрдЙрдЯ рдХрд╣рд╛ рдФрд░ рдореВрд▓реНрдп рдХреЛ рджреВрд╕рд░реА рдирд┐рд░реНрднрд░рддрд╛ рдХреЗ рд▓рд┐рдП рдкрд╛рд░рд┐рдд рдХрд░ рджрд┐рдпрд╛ред рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЗ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд▓рдЧ рдкрд░реАрдХреНрд╖рдг рд╡рд┐рдзрд┐ рдмрдирд╛рдирд╛ рдмреЗрд╣рддрд░ рдерд╛, рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ рдЗрд╕реЗ рдмрд┐рдирд╛ рдХрд┐рд╕реА рдХрд╛рд░рдг рдХреЗ, рдЕрдирд╛рдпрд╛рд╕ рдЫреЛрдбрд╝ рджрд┐рдпрд╛ред рдЗрд╕рдХреЗ рдмрд╛рдж, рд╣рдо рдПрдХ рд╕рдВрджреЗрд╢ рднреЗрдЬрддреЗ рд╣реИрдВ, рдФрд░ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдЗрд╕реЗ рдбреЛрдиреЗрд╢рди рдХреЗ рд▓рд┐рдП рднреЗрдЬ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИредрдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдкрд░реАрдХреНрд╖рдг рдХреЛрдб рдкреВрд░рд╛ рд╣реЛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдШреЛрд╖рд┐рдд рдореЛрдХ рдХреЗ рд╕рд╛рде рдЕрддрд┐рд░рд┐рдХреНрдд рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдореАрдХреНрд╖рд╛ рдпрд╛ рд░реАрдбрд┐рдЬрд╝рд╛рдЗрди рдХреЛ рдмрд╛рдзреНрдп рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╕рдВрднрд╛рд╡рд┐рдд рд╕рдордп рд▓рд╛рдЧрдд рдХреЛ рдХрдо рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдЕрдкрдиреЗ рдЖрдк рдореЗрдВ Moq рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдЪреНрдЫрд╛ рдкрд░реНрдпрд╛рдкреНрдд рдХрд╛рд░рдг рд╣реИредрд▓реЛрдб рдкрд░реАрдХреНрд╖рдг
рдореБрдЭреЗ NLog рдкрд░ рдЕрдкрдиреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреА рд╢реНрд░реЗрд╖реНрдарддрд╛ рдХреЛ рджреЗрдЦрдиреЗ рдХреА рдЙрдореНрдореАрдж рдереА, рдореИрдВ рдорд╛рдЗрдХреНрд░реЛрдкреЛрдкреНрдЯрд┐рдЗрдореНрдпреВрдПрд╢рди рдкрд░ рдзреНрдпрд╛рди рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рдерд╛, рдЕрдкреЗрдХреНрд╖рд╛рдУрдВ рдХреЛ рдереЛрдбрд╝рд╛ рдмреЗрд╣рддрд░ рдврдВрдЧ рд╕реЗ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреИрд╕рд╛ рдмрдЪрд╛ рд╕рдХрддрд╛ рдерд╛ред рд▓реЗрдХрд┐рди рдмрд╣реБрдд рдкрд╣рд▓реЗ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдиреЗ рдореБрдЭреЗ рдорд╛рд░рд╛, рдРрд╕реА рдЗрдЪреНрдЫрд╛ рдХреЛ рджреЛрд╣рд░рд╛рддреЗ рд╣реБрдПредрд▓реЛрдб рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдПрдХ рдХрдВрд╕реЛрд▓ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛рдпрд╛, рдЬрд┐рд╕рдореЗрдВ рдореИрдВрдиреЗ рдПрдХ рд▓рдХрдбрд╝рд╣рд╛рд░рд╛ рд▓рд┐рдпрд╛ рдФрд░ рдЙрд╕реЗ рд▓реВрдк рдореЗрдВ рд╕рдВрджреЗрд╢ рднреЗрдЬреЗред var log = SharpLogger.LogAccess.GetLogger("flooder " + tid); foreach (var x in Enumerable.Range(0, messageCount)) { log.Info("Message", x); if (x % 1000 == 0) Thread.Sleep(0); }
рдФрд░ NLog рдХреЗ рд▓рд┐рдП рдПрдХ рд╣реА рд╡рд┐рдзрд┐ред var log = NLog.LogManager.GetLogger("flooder " + tid); foreach (var x in Enumerable.Range(0, messageCount)) { log.Info("Message"); if (x % 1000 == 0) Thread.Sleep(0); }
рд╡рд┐рдзрд┐ рдореЗрдВ рдПрдХ tid рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдирд┐рд╖реНрдкрд╛рджрди рдХрдИ рдереНрд░реЗрдбреНрд╕ рдореЗрдВ рд╣реЛрддрд╛ рд╣реИредрдмреЗрд╢рдХ, рдореИрдВрдиреЗ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдП, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рдкрд░реАрдХреНрд╖рдг рд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рдлреА рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред рддреАрди рдзрд╛рд░рд╛рдПрдБ рдкреНрд░рддреНрдпреЗрдХ рдореЗрдВ 200 рд╣рдЬрд╝рд╛рд░ рд╕рдВрджреЗрд╢ рднреЗрдЬрддреА рд╣реИрдВред рдЯрд╛рд╕реНрдХ рдореИрдиреЗрдЬрд░ рдХреЗ рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ рдореЗрдВ, рдкреНрд░реЛрд╕реЗрд╕рд░ рд▓реЛрдб рд╣реЛ рд░рд╣рд╛ рд╣реИред рдкрд╣рд▓рд╛ рдЫреЛрдЯрд╛ рдлрдЯ рдореЗрд░рд╛ рд▓рдХрдбрд╝рд╣рд╛рд░рд╛ рд╣реИ, рдлрд┐рд░, 5 рд╕реЗрдХрдВрдб рдХреА рджреЗрд░реА рдХреЗ рдмрд╛рдж, NLog рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдкрд░рд┐рдгрд╛рдореА рд▓реЙрдЧрдлрд╝рд╛рдЗрд▓реНрд╕ рд╕рдорд╛рди рд░реВрдк рд╕реЗ рдмрджрд▓ рдЧрдИ, рдмреЗрдореЗрд▓ рд╕рдордп рдХреЗ рдЕрдкрд╡рд╛рдж рдХреЗ рд╕рд╛рдеред
рдореИрдВ рдкрд░реАрдХреНрд╖рдг рдХрд╛рд░реНрдпрдХреНрд░рдо рджреНрд╡рд╛рд░рд╛ рдорд╛рдк рдХрд╛ рдПрдХ рдЖрддреНрдо-рд╡реНрдпрд╛рдЦреНрдпрд╛рддреНрдордХ рдкрд░рд┐рдгрд╛рдо рднреА рджреВрдВрдЧрд╛ред
рдЬрдм x64 рдХреЗ рддрд╣рдд recompiling, рдкрд░рд┐рдгрд╛рдо рд▓рдЧрднрдЧ рдЕрдкрд░рд┐рд╡рд░реНрддрд┐рдд рд╣реИред
рдмреЗрд╢рдХ, рдЖрдкрдХреЛ рдПрдХ рдмрд╛рд░реАрдХрд┐рдпреЛрдВ рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ - рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдереНрд░реЗрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ рдЬреЛ Nlog рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдореИрдВ рдХреЗрд╡рд▓ рдкреНрд░реЛрд╕реЗрд╕рд░ рд╕рдордп рдХреЛ рдорд╛рдкрддрд╛ рд╣реВрдВ рдХрд┐ рднреЗрдЬрдиреЗ рдХрд╛ рдХрд╛рд░реНрдп рдХреЙрд▓рд┐рдВрдЧ рдереНрд░реЗрдбреНрд╕ рд╕реЗ рд▓рд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рдореИрдВ рдкреНрд░реЛрд╕реЗрд╕рд░ рд▓реЛрдб рдХреЛ рдмрд╛рдпрдкрд╛рд╕ рдХрд░рддрд╛ рд╣реВрдВ рдЬреЛ рдпрд╣ рдереНрд░реЗрдб рдмрдирд╛рддрд╛ рд╣реИред рдореИрдВрдиреЗ рдпрд╣ рднреА рджреЗрдЦрдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ 40 рдорд┐рд▓рд┐рдпрди рдзрд╛рд░рд╛рдУрдВ рдХреЛ рдЖрдзрд╛ рдорд┐рд▓рд┐рдпрди рд╕рдВрджреЗрд╢ рднреЗрдЬрдХрд░ рдкрд░реАрдХреНрд╖рдг рдЪрд▓рд╛ рд░рд╣рд╛ рд╣реИред
рдкрд░рд┐рдгрд╛рдо рдЬреЛ рдХрд╛рд░реНрдпрдХреНрд░рдо рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рд╡рд╣ 7.15 рд╕реЗрдХрдВрдб рд╣реИред рд▓реЗрдХрд┐рди рдЧреНрд░рд╛рдлрд╝ рд╕реЗ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рдлрд╝рд╛рдЗрд▓ рдХреЛ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд▓рдХрдбрд╝рд╣рд╛рд░рд╛ рд╕реНрдЯреНрд░реАрдо рдиреЗ рд▓рдЧрднрдЧ 25 рд╕реЗрдХрдВрдб рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд┐рдпрд╛ред рдпрд╣ рдирд┐рд╕реНрд╕рдВрджреЗрд╣ рдПрдХ рдЦрд╛рдореА рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд▓реЙрдЧрдСрдирд░ рд╕реЗ рдкрд╣рд▓реЗ рд╕рдорд╛рдкреНрдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдкреВрд░реНрдг рд░рд┐рдХреЙрд░реНрдбрд┐рдВрдЧ рд╕реЗ рдкрд╣рд▓реЗ, рдЬрд┐рд╕реЗ рдПрдирд▓реЙрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдмрд╛рд╣рд░ рд░рдЦрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореБрдЦреНрдп рдХрд╛рд░реНрдпрдХреНрд░рдо рдореЗрдВ рд▓реЛрдб рд╣реЛрдиреЗ рдкрд░ рднреА рдереНрд░реЗрдб рдореЗрдВ рдПрдХ рдкреНрд░реЛрд╕реЗрд╕рд░ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╣реЛрдЧрд╛ред рдпрд╣рд╛рдБ рдЖрд░рд╛рдо рджреЗрдиреЗ рд╡рд╛рд▓реА рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдЗрд╕ рддрд░рд╣ рдХреЗ рдХрдИ рд▓реЙрдЧреНрд╕ рдХреЗ рд╕рд╛рде рдПрдирдУрд▓реЛрдЧ рдЕрдиреБрдорд╛рдирд┐рдд рдЕрдиреБрдорд╛рди рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдЫрд╣ рдШрдВрдЯреЗ рддрдХ рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЛ рдорд╛рд░ рджреЗрдЧрд╛, рдЬреЛ рдЗрд╕ рдЦрд╛рдореА рдХреЗ рд╕рд╛рде рд╕рд╛рдордВрдЬрд╕реНрдп рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдХрд╛рд░рдг рдмрдирддрд╛ рд╣реИредрдФрд░ рдПрдХ рдФрд░ рдмрд╛рдд рдЬрд┐рд╕рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рд╡рд╣ рд╣реИ рдЕрд╡рд░реБрджреНрдз рдХреЗ рд╕рд╛рде рдПрдХ рдирд┐рдпрдорд┐рдд рдХрддрд╛рд░ рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖ рдкреНрд░рджрд░реНрд╢рди рдкрд░ рдЧреИрд░-рдЕрд╡рд░реБрджреНрдз рдХрддрд╛рд░ рдХрд╛ рдкреНрд░рднрд╛рд╡редрдЙрдиреНрд╣реЛрдВрдиреЗ рджреЛ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдП, рдкрд╣рд▓реА 3 рдзрд╛рд░рд╛рдУрдВ рдореЗрдВ рдЙрдиреНрд╣реЛрдВрдиреЗ рдкреНрд░рддреНрдпреЗрдХ рдореЗрдВ 15 рдорд┐рд▓рд┐рдпрди рд╕рдВрджреЗрд╢ рднреЗрдЬреЗ, рдПрдХ рдЧреИрд░-рдЕрд╡рд░реБрджреНрдз рдХрддрд╛рд░ рдиреЗ рдорд╛рдкрд╛ рд╕рдордп рдХреЛ 22.2 рд╕реЗрдХрдВрдб рд╕реЗ рдШрдЯрд╛рдХрд░ 17.8 рдХрд░ рджрд┐рдпрд╛ред рдереНрд░реЗрдбреНрд╕ рдХреА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ 30 рддрдХ рдХреА рд╡реГрджреНрдзрд┐ рдХреЗ рд╕рд╛рде, рдФрд░ рд╕рдВрджреЗрд╢реЛрдВ рдХреА рдХреБрд▓ рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдмрдирд╛рдП рд░рдЦрддреЗ рд╣реБрдП, рдпрд╛рдиреА 1.5 рдорд┐рд▓рд┐рдпрди рдкреНрд░рддрд┐ рд╕реНрдЯреНрд░реАрдо, рдЕрд╡рд░реБрджреНрдз рдХрддрд╛рд░ рдиреЗ рдкрд░реАрдХреНрд╖рдг рдХреЛ рдереЛрдбрд╝рд╛ рдзреАрдорд╛ рдХрд░рдХреЗ 23.7 рд╕реЗрдХрдВрдб рдХрд░ рджрд┐рдпрд╛, рдЬрдмрдХрд┐ рдЧреИрд░-рдЕрд╡рд░реБрджреНрдз, рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд, 17.4 рддрдХ рдереЛрдбрд╝рд╛ рд╕рд╛ рдмрдврд╝ рдЧрдпрд╛, рдЬрд┐рд╕рд╕реЗ рдЕрдВрддрд░рд╛рд▓ рдмрдврд╝ рдЧрдпрд╛редрдЬреИрд╕рд╛ рдХрд┐ рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ рд╕реЗ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдкрд░реАрдХреНрд╖рдг 4 рдХреЛрд░ i5 рдкрд░ 4 рдЧреАрдЧрд╛рд╣рд░реНрдЯреНрдЬ рдХреА рдЖрд╡реГрддреНрддрд┐ рдХреЗ рд╕рд╛рде рд╡рд┐рдВрдбреЛрдЬрд╝ 8 рдкрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЛ рдЬреАрдердм рд╕реЗ https://github.com/repinvv/SharpoggerрддреНрд░реБрдЯрд┐рдпреЛрдВ, рдЯрд╛рдЗрдкреЛрд╕ рдФрд░ рдЕрдиреНрдп рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ - рд╡реЗрд▓рдХрдо рдореЗрдВ рдбрд╛рдЙрдирд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ ред