рдПрдХ рддреЗрдЬрд╝-рддрд░реНрд░рд╛рд░, рдмрдбрд╝реЗ рдФрд░ рдЬрдЯрд┐рд▓ рдЙрддреНрдкрд╛рдж рдореЗрдВ, рдкреНрд░рджрд░реНрд╢рди рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдЕрдбрд╝рдЪрдиреЗрдВ рдвреВрдВрдврдирд╛ рдЕрдм рдХреЛрдИ рдорд╛рдореВрд▓реА рдХрд╛рдо рдирд╣реАрдВ рд░рд╣ рдЧрдпрд╛ рд╣реИред рдмреЗрд╢рдХ, рдРрд╕реА рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдХрд░рдг рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП,
рдмреЗрдВрдЪрдорд╛рд░реНрдХрдбреЙрдЯрдиреЗрдЯ ред рдирд┐рд╕реНрд╕рдВрджреЗрд╣, рдпрд╣ рдПрдХ рдЙрдкрдпреЛрдЧреА рдФрд░ рдЖрд╡рд╢реНрдпрдХ рдЙрдкрдХрд░рдг рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╣рдореЗрд╢рд╛ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЬрдм рд╕рдВрдмрдВрдзрд┐рдд рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдХреЗ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд╡рд┐рдзрд┐ рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдорд╛рдкрдирд╛ рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдирд┐рдЬреА рд╡рд┐рдзрд┐ рдХреЗ рдЕрдВрджрд░ рдХреЛрдб рдХрд╛ рдХреБрдЫ рдЯреБрдХрдбрд╝рд╛ред рдпрд╣рд╛рдВ, рдХрд┐рд╕реА рднреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдореИрдВ рдирд╛рдорд┐рдд рдЯреВрд▓ рдХреА рдЖрд▓реЛрдЪрдирд╛ рдирд╣реАрдВ рдХрд░реВрдВрдЧрд╛, рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рдХреЛрдб рдЕрдВрд╢реЛрдВ рдХреЗ рд▓рд┐рдП рдореИрдЯреНрд░рд┐рдХреНрд╕ рдПрдХрддреНрд░ рдХрд░рдиреЗ рдХреЗ рдереЛрдбрд╝реЗ рдЕрд▓рдЧ рддрд░реАрдХреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рдмрд╣реБрдд рдЬрдЯрд┐рд▓, рднреНрд░рд╛рдордХ рддрд░реАрдХреЗ рд╣реИрдВ, рд╢рд╛рдЦрд╛рдУрдВ рдХреЗ рд╕рд╛рде, рдЫреЛрд░реЛрдВ рдХреЗ рд╕рд╛рде, рдЕрд╕рд╛рдзрд╛рд░рдг рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдирд╛, рдФрд░ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕реНрдерд╛рди рдХрд╣реАрдВ рдЕрдВрджрд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕реЗ рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдореАрдЯрд░ рдХреЗ рд╕рд╛рде рдХреЛрдб рдХреЛ рдмрд╣реБрддрд╛рдпрдд рд╕реЗ рдХрд╡рд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЬрдмрдХрд┐ рдореМрдЬреВрджрд╛ рддрд░реНрдХ рдХреЛ рдЫреВрдиреЗ рдпрд╛ рдлрд┐рд░ рд╕реЗ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рдиреЗ рдХреА рд╕реНрдкрд╖реНрдЯ рдЗрдЪреНрдЫрд╛ рд╣реИред
рдХреЛрдб рдЕрдиреБрднрд╛рдЧреЛрдВ рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рд╕рдордп рдХреЛ рдорд╛рдкрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдк StopWatch рд╡рд░реНрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдХреБрдЫ рдЗрд╕ рддрд░рд╣:
var sw = new Stopwatch(); sw.Start();
рд╣рд░ рдмрд╛рд░ рдХреЛрдб рджреНрд╡рд╛рд░рд╛ рд╕реНрдЯреЙрдкрд╡реЙрдЪ рдХреЛ рди рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рдПрдХ рдЙрдЪреНрдЪ-рдХреНрд░рдо рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдорд╛рдк рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдПрдХреАрдХреГрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЬреИрд╕реЗ:
static void LambdaMeter(string label, Action act) { var sw = new Stopwatch(); sw.Start(); act(); sw.Stop(); Console.WriteLine($"{label} : {sw.Elapsed}");
рдФрд░ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ:
LambdaMeter("foo", () => {
рдЖрдк рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХреЙрд▓ рдХреЛ рдЕрдВрджрд░ рдмрд╛рд╣рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
public static class TimeInspector { public static void Meter(this Action act, string label) { var sw = new Stopwatch(); sw.Start(); act(); sw.Stop(); Console.WriteLine($"{label} : {sw.Elapsed}");
рдФрд░ рдЗрд╕ рддрд░рд╣ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ:
new Action(() => {
рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕рдорд╕реНрдпрд╛ рд╣рд▓ рд╣реЛ рдЧрдИ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрднреА рднреА рдпрд╣ рддрдХрдиреАрдХ рдмреЗрд╣рдж рд╕реАрдорд┐рдд рд╣реИред рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рдорд╛рдкрд╛ рдХреЛрдб рдореЗрдВ рд░рд┐рдЯрд░реНрди рдЖрдЙрдЯрдкреБрдЯ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдЖрдк рдЗрд╕реЗ рдПрдХреНрд╢рди рдореЗрдВ рдирд╣реАрдВ рд▓рдкреЗрдЯ рд╕рдХрддреЗред рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ Func рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рд╕рдорд╕реНрдпрд╛ рд╣рд▓ рдирд╣реАрдВ рд╣реЛрдЧреАред рдиреАрдЪреЗ рдореИрдВ рдПрдХ рдРрд╕реА рддрдХрдиреАрдХ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдЬрд┐рд╕рдХрд╛ рдореИрдВрдиреЗ рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рдмрд╛рд░ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдерд╛, рдпрд╣ рдХреЛрдб рдореЗрдВ рд╕рдмрд╕реЗ рдЫреЛрдЯреЗ рдмрджрд▓рд╛рд╡реЛрдВ рдХреЗ рд╕рд╛рде рдХреЛрдб рдХреЗ рдордирдорд╛рдиреЗ рд╡рд░реНрдЧреЛрдВ рдХреЛ рдорд╛рдкрдиреЗ рдХреА рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░реЗрдЧрд╛ред рд╣рдо рдирд┐рд╖реНрдкрд╛рджрди рдХреА рдЧрддрд┐ рдХреЛ рдорд╛рдкрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд░рд▓ рдФрд░ рдХреЙрдореНрдкреИрдХреНрдЯ рд▓реЙрдЧрд░ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░реЗрдВрдЧреЗ; рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ, рддреЛ рдпрд╣ рдЕрдиреНрдп рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рднреА рдХрд╛рдлреА рд╕рд░рд▓ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╕реНрдореГрддрд┐ рд▓реАрдХ рдХреА рдЦреЛрдЬ рдХрд░рдирд╛ред рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рдХреЛрдб рдкреВрд░реНрдг рдФрд░ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рд╣реЛрдиреЗ рдХрд╛ рджрд╛рд╡рд╛ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рдмрд▓реНрдХрд┐ рдЙрд╕ рд╕рд┐рджреНрдзрд╛рдВрдд рдХрд╛ рдПрдХ рдкреНрд░рджрд░реНрд╢рди рд╣реИ рдЬрд┐рд╕рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЖрдк рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЙрдкрдпреЛрдЧреА рдФрд░ рдЖрд╕рд╛рди рдЙрдкрдХрд░рдг рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдХреЛрдб рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИ рдФрд░ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдореЗрдЯреНрд░рд┐рдХреНрд╕ рдХреЛ рдЗрдХрдЯреНрдард╛ рдХрд░рдиреЗ рдХреЗ рдЙрджреНрджреЗрд╢реНрдп рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдпрд╛ рдЕрдзрд┐рдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдореИрдВ рдпрд╣ рднреА рдиреЛрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдиреАрдЪреЗ рджреА рдЧрдИ рдХреЛрдб рдореЗрдВ рдЕрддрд┐рд░рд┐рдХреНрдд рдЬрд╛рдирдХрд╛рд░реА рдПрдХрддреНрд░ рдХреА рдЧрдИ рд╣реИ, рдЬреИрд╕реЗ рдХрд┐ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдЖрдИрдбреА рдпрд╛ рд╣реЛрд╕реНрдЯ рдирд╛рдоред рдпреЗ рдкреИрд░рд╛рдореАрдЯрд░ рдХреБрдЫ рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ рдореЗрд░реЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рдереЗ рдФрд░ рдХреЗрд╡рд▓ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ рдЫреЛрдбрд╝ рджрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рдЬреЛ рдХреЛрдИ рднреА рдЕрдкрдиреЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдХреЛрдб рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓реЗрддрд╛ рд╣реИ, рдЙрд╕реЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд▓рдЧ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдЗрдХрдЯреНрдард╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИ, рдЖрдВрд╢рд┐рдХ рд░реВрдк рд╕реЗ рдЗрд╕ рдХрд╛рд░рдг рд╕реЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХреЛрдб рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдЙрддреНрдкрд╛рдж рдкрд░ рдкреНрд░рдХрд╛рд╢рд┐рдд рдЙрддреНрдкрд╛рдж рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рдХрд╛рд╢рд┐рдд рдирд╣реАрдВ рд╣реБрдЖред
C # рдореЗрдВ рдПрдХ рдкреНрд░рд╕рд┐рджреНрдз рдФрд░ рдЙрдкрдпреЛрдЧреА рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдпрд╣ рдЙрди рдкреНрд░рдХрд╛рд░реЛрдВ рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИ, рдЬреЛ рдЖрдИрдбреАрд╕реЛрдкрд╛рдпрд░реА рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддреЗ рд╣реИрдВред рдмрд┐рдВрджреБ рдпрд╣ рд╣реИ рдХрд┐ рдЬрдм рдЖрдк рдСрдкрд░реЗрдЯрд░ рдмреНрд▓реЙрдХ рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рддреЗ рд╣реИрдВ, рддреЛ рдбрд┐рд╕реНрдкреЛрдЬрд╝ рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░реЗрдВ, рдЬрд┐рд╕рдореЗрдВ, рдПрдХ рдирд┐рдпрдо рдХреЗ рд░реВрдк рдореЗрдВ, рд╕рдВрд╕рд╛рдзрди рдЬрд╛рд░реА рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЗрд╕ рддрдВрддреНрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рд╡рд┐рднрд┐рдиреНрди рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ рдмреНрд▓реЙрдХ рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рд╕рдордп рдХрд╛ рдПрдХ рдорд╛рдк рд╣реЛрдЧрд╛, рдЗрд╕рдХреЗ рдмрд╛рдж рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреЗ рд▓рд┐рдП рдкрд░рд┐рдгрд╛рдо рдХреЛ рдмрдЪрд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рд╡рд┐рдЪрд╛рд░ рдпрд╣ рд╣реИ рдХрд┐ рд╡рд░реНрдЧ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдкреНрд░рдпреЛрдЧ рдмреНрд▓реЙрдХ рдореЗрдВ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдирд┐рд░реНрдорд╛рдг рдХреЗ рд╕рдордп, рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреА рдЙрдкрдпреЛрдЧреА рдЬрд╛рдирдХрд╛рд░реА рдПрдХрддреНрд░ рдХреА рдЬрд╛рддреА рд╣реИ рдФрд░ рд╕реНрдЯреЙрдкрд╡реЙрдЪ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИред рдЬрдм рдмреНрд▓реЙрдХ рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рдиреЗ рдкрд░ рдбрд┐рд╕реНрдкреЛрдЬрд╝ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдкрд░рд┐рдгрд╛рдо рддрдп рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рд▓реЙрдЧ рдХреЛ рд╕рд╣реЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдСрдмреНрдЬреЗрдХреНрдЯ рднреЗрдЬрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдХрдерди рд╡рд╛рдХреНрдпрдЧрдд рд╢рд░реНрдХрд░рд╛ рд╣реИ; рдЬрдм рд╕рдВрдХрд▓рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдПрдХ рдХреЛрд╢рд┐рд╢-рдЕрдВрддрд┐рдо рдмреНрд▓реЙрдХ рдореЗрдВ рдмрджрд▓ рдЬрд╛рддрд╛ рд╣реИред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХреЛрдб:
using(var obj = new SomeDisposableClass()) {
рдПрдХ рджреГрд╢реНрдп рдбрд┐рдЬрд╛рдЗрди рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд:
IDisposable obj = new SomeDisposableClass(); try {
рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдХреЛрд╢рд┐рд╢ рдмреНрд▓реЙрдХ рд╕реЗ рдХрд┐рд╕реА рднреА рдмрд╛рд╣рд░ рдирд┐рдХрд▓рдиреЗ рдкрд░, рдирд┐рдкрдЯрд╛рди рд╡рд┐рдзрд┐ рдХреА рдЧрд╛рд░рдВрдЯреА рджреА рдЬрд╛рдПрдЧреА рдФрд░ рддреБрд░рдВрдд рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдЬрдмрдХрд┐ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рд░рдЦрд╛ рдХреЛрдб рдХрд╛ рддрд░реНрдХ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдирд╣реАрдВ рдмрджрд▓реЗрдЧрд╛ред рд╣рдо рд╕рдм рдмрджрд▓ рджрд┐рдпрд╛ рд╣реИ рдПрдХ рдХреЙрд▓ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИред рдЗрд╕ рд╡рд┐рдЪрд╛рд░ рд╕реЗ рдирд┐рд░реНрджреЗрд╢рд┐рдд, рд╣рдо рд╕рдмрд╕реЗ рд╕рд░рд▓ рд░рдирдЯрд╛рдЗрдо рдХреЛрдорд╛рдИрдЬрд╝рд░ рдмрдирд╛рдПрдВрдЧреЗред
public class Meter :IDisposable { private Stopwatch _sw; private string _label; public static Meter Job(string lable) { return new Meter(lable); } Meter(string label) { _label = label; _sw = Stopwatch.StartNew(); } public void Dispose() { _sw.Stop(); Console.WriteLine($"{_label} : {_sw.Elapsed}");
рдФрд░ рдЗрд╕рд▓рд┐рдП, рдпрд╣ рд╣рдореЗрдВ рдХреНрдпрд╛ рджреЗрддрд╛ рд╣реИ?
рд╡рд░реНрдгрд┐рдд рддрдХрдиреАрдХ рдореЗрдВ рдХреНрдпрд╛ рдЧрд╛рдпрдм рд╣реИ? рдкрд░рд┐рдгрд╛рдо рдХреЛ рд╕реБрд░рдХреНрд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд╡рд┐рд╖рдп рдХрд╛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЦреБрд▓рд╛рд╕рд╛ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рдкрд░рд┐рдгрд╛рдо рдХреЛ рд╕рд╛рдВрддреНрд╡рдирд╛ рдореЗрдВ рджрд░реНрдЬ рдХрд░рдиреЗ рдореЗрдВ рдмрд╣реБрдд рд╕рдордЭрджрд╛рд░реА рдирд╣реАрдВ рд╣реИред рдЬреНрдпрд╛рджрд╛рддрд░ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рд╡рд┐рдЬрд╝реБрдЕрд▓рд╛рдЗрдЬрд╝реЗрд╢рди
рдмрдиреНрд╕ рдФрд░ рдорд┐рдирд┐рдордо рдХреЙрдорд┐рдХреНрд╕ рдХреЗ рд╕рд╛рде рд▓реЛрдХрдкреНрд░рд┐рдп рд▓реЛрдХрдкреНрд░рд┐рдп рдЙрдкрдХрд░рдг NLog, Log4Net, Serilog рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдХрд╛рдлреА рд╕рдВрднрд╡ рд╣реИред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЧрдВрднреАрд░ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдЕрдзрд┐рдХ рдкрд░рд┐рд╖реНрдХреГрдд рд╡рд┐рд╢реНрд▓реЗрд╖рд┐рдХреА рдХреЗ рд▓рд┐рдП рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИ рдХрд┐ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИред
рдЖрдк рдкрд░рд┐рдгрд╛рдо рдХреЛ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдкрд╛рда рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЗрд╕ рдХрд╛рд░реНрдп рдХреЗ рд▓рд┐рдП рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рдмрд╣реБрдд рд╣реА рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдХреЛрдб рдХреЗ рдХрдИ рдЯреБрдХрдбрд╝реЗ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рд╡реЗ рд╕рдВрднрд╡рдд: рдиреЗрд╕реНрдЯреЗрдб рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдХрдИ рд╕рдорд╛рдирд╛рдВрддрд░ рдзрд╛рдЧреЗред рдЗрд╕рд▓рд┐рдП, рд▓реЙрдЧ рдХреЛ рдиреЗрд╡рд┐рдЧреЗрдЯ рдХрд░рдиреЗ рдХреА рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП, рд╣рдо SQLite рдбреЗрдЯрд╛рдмреЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред
рд╣рдо рдПрдХ рд╡рд░реНрдЧ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рд╕реЗ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рд╕рдордп рдХреЛ рдорд╛рдкрдиреЗ рдФрд░ рдмрд╛рдж рдХреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреЗ рд▓рд┐рдП рдЕрддрд┐рд░рд┐рдХреНрдд рдЙрдкрдпреЛрдЧреА рдЬрд╛рдирдХрд╛рд░реА рдкрд░ рдХрдмреНрдЬрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИред
public class LogItem : IDisposable { public string Id;
рд▓рдХрдбрд╝рд╣рд╛рд░рд╛ рдСрдмреНрдЬреЗрдХреНрдЯ рдФрд░ рдЕрддрд┐рд░рд┐рдХреНрдд рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП рдПрдХ рд▓рд┐рдВрдХ LogItem рд╡рд░реНрдЧ рдХреЗ рдирд┐рд░реНрдорд╛рддрд╛ рдХреЛ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЙрд╕ рд╡рд┐рдзрд┐ рдХрд╛ рдкреВрд░рд╛ рдирд╛рдо рдЬрд┐рд╕рдореЗрдВ рдорд╛рдк рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдПрдХ рдордирдорд╛рдирд╛ рд╕рдВрджреЗрд╢ рдХреЗ рд╕рд╛рде рдПрдХ рд▓реЗрдмрд▓ рд╣реЛрддрд╛ рд╣реИред рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдХреЛрдб рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рд╕реЗ рд▓реЙрдЧ рдХреЛ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП, Tid (рдереНрд░реЗрдб рдЖрдИрдбреА) рдлрд╝реАрд▓реНрдб рдореЗрдВ рдорджрдж рдорд┐рд▓реЗрдЧреА, рдЬрд┐рд╕рдХреЗ рджреНрд╡рд╛рд░рд╛ рдЖрдк рдПрдХ рдереНрд░реЗрдб рд╕реЗ рдбреЗрдЯрд╛ рд╕рдореВрд╣ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╕рд╛рде рд╣реА, LogItem рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рддреЗ рд╕рдордп, рдорд╛рдк рдкреНрд░рд╛рд░рдВрдн рд╕рдордп рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ StopWatch рдкреНрд░рд╛рд░рдВрдн рд╣реЛрддрд╛ рд╣реИред рдбрд┐рд╕реНрдкреЛрдЬрд╝ рд╡рд┐рдзрд┐ рдореЗрдВ, рд╕реНрдЯреЙрдкрд╡реЙрдЪ рдХреЛ рд░реЛрдХреЗрдВ рдФрд░ рд░рд╛рдЗрдЯрд▓реЙрдЧ рд▓реЙрдЧрд░ рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░реЗрдВ, рд╡рд░реНрддрдорд╛рди рд╢реВрдЯрд░ рдХреЗ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдкрд╛рд╕ рдХрд░реЗрдВ рдФрд░ рдЗрд╕рдХреЗ рд▓рд┐рдП рд╕рднреА рдЖрд╡рд╢реНрдпрдХ LogItem рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рдареАрдХ рдХрд░реЗрдВред
рд▓рдХрдбрд╝рд╣рд╛рд░реЗ рдХреЗ рдкрд╛рд╕ рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рджреЛ рдореБрдЦреНрдп рдХрд╛рд░реНрдп рд╣реЛрддреЗ рд╣реИрдВ: рдПрдХ LogItem рдСрдмреНрдЬреЗрдХреНрдЯ рдЖрд░рдВрдн рдХрд░рдирд╛ рдФрд░ рдорд╛рдк рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рдкрд░рд┐рдгрд╛рдо рд░рд┐рдХреЙрд░реНрдб рдХрд░рдирд╛ред рдЪреВрдБрдХрд┐ рдореБрдЭреЗ рдЕрднреА рднреА рдкрд░рд┐рдгрд╛рдо рди рдХреЗрд╡рд▓ SQLite рдореЗрдВ, рдмрд▓реНрдХрд┐ SQLite рдХреЗ рдЕрд▓рд╛рд╡рд╛ рд╡рд┐рднрд┐рдиреНрди рд╕реНрд╡рд░реВрдкреЛрдВ рдпрд╛ рдбреЗрдЯрд╛рдмреЗрд╕реЛрдВ рдХреА рдкрд╛рда рдлрд╝рд╛рдЗрд▓реЛрдВ рдореЗрдВ рднреА рджрд░реНрдЬ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЗрдВрдЯрд░реИрдХреНрд╢рди рд▓реЙрдЬрд┐рдХ рдХреЛ рдПрдХ рдЕрд▓рдЧ рд╡рд░реНрдЧ рдореЗрдВ рд░рдЦрд╛ рдЧрдпрд╛ рд╣реИред рд▓рдХрдбрд╝рд╣рд╛рд░рд╛ рд╡рд░реНрдЧ рдореЗрдВ, рдХреЗрд╡рд▓ рд╕рд╛рдорд╛рдиреНрдп рд╣рд┐рд╕реНрд╕рд╛ рдмрдЪрд╛ рд╣реИред
public class Logger { public string LId;
рдФрд░ рдЗрд╕рд▓рд┐рдП, рд▓рдХрдбрд╝рд╣рд╛рд░рд╛ рд╡рд░реНрдЧ рдордзреНрдпрд╡рд░реНрддреА рд╣реИ, рдЗрд╕рдХрд╛ рдХрд╛рд░реНрдп рдЙрд╕ рд╡рд╛рддрд╛рд╡рд░рдг рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдПрдХрддреНрд░ рдХрд░рдирд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд▓реЙрдЧрд┐рдВрдЧ рд╢реБрд░реВ рдХреА рдЧрдИ рд╣реИред рдЙрдкрд░реЛрдХреНрдд рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдпрд╣ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд▓реЙрдЧрд┐рди, рдорд╢реАрди рдХрд╛ рдирд╛рдо, рдиреЗрдЯрд╡рд░реНрдХ рдкрддрд╛ рдЖрдИрдбреА рдФрд░ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд╛ рдирд╛рдо рд╣реИред рдпрд╣ рд╕рднреА рдЬрд╛рдирдХрд╛рд░реА рдЙрдкрдпреЛрдЧреА рд╣реИ рдЬрдм рд╣рдо рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдорд╢реАрди рдкрд░ рдХреЛрдб рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рд╕рдордп рдХреЛ рдорд╛рдкрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЕрд░реНрдерд╛рддред рд╡рд┐рд╕рдВрдЧрддрд┐рдпреЛрдВ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдкрд╣рдЪрд╛рди рдХреЗ рд▓рд┐рдП рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдкрд╛рдардХ рдЗрд╕ рдмрд╛рдд рд╕реЗ рд╕рд╣рдордд рд╣реЛрдВрдЧреЗ рдХрд┐ рдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ рдорд╛рдк рдХреЗ рджреМрд░рд╛рди рд▓рдХрдбрд╝рд╣рд╛рд░рд╛ рдХрд╛ рдорд╛рдкрд╛ рдХреЛрдб рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рд╕рдордп рдкрд░ рдиреНрдпреВрдирддрдо рдкреНрд░рднрд╛рд╡ рдкрдбрд╝рддрд╛ рд╣реИред рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдкрд░рд┐рдгрд╛рдо рдХреЛ рд╕рд╣реЗрдЬрдирд╛ рдХрддрд╛рд░ рдореЗрдВ рдЬреЛрдбрд╝рдХрд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдкреГрд╖реНрдарднреВрдорд┐ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдЧрддрд┐ рджреЗрддрд╛ рд╣реИ, рдкрд░рд┐рдгрд╛рдо рдХреЛ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рд╕рд╣реЗрдЬрддрд╛ рд╣реИ, рдлрд╝рд╛рдЗрд▓ рдХрд░рддрд╛ рд╣реИ рдпрд╛ рдиреЗрдЯрд╡рд░реНрдХ рдкрд░ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдореЗрдВ рдПрдХ рдЧрдВрднреАрд░ рдЦрд╛рдореА рд╣реИ, рдЕрдЧрд░ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд▓реЙрдЧрд┐рдВрдЧ рдЗрд╡реЗрдВрдЯ рд╣реИрдВ, рддреЛ рдХрддрд╛рд░ рдХреЛ рд╕реНрдкрд┐рди рдХрд░рдиреЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рддреЗрдЬреА рд╕реЗ рднрд░рдирд╛ рд╣реЛрдЧрд╛, рдЬрдм рддрдХ рдХрд┐ рдпрд╣ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдЙрдкрд▓рдмреНрдз рд╕рднреА рдореЗрдореЛрд░реА рдХреЛ рдирд╣реАрдВ рд▓реЗрддрд╛ред рд▓реЗрдХрд┐рди рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдХреЛ рднрдбрд╝рдХрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЕрднреА рднреА рдкреНрд░рдпрд╛рд╕ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд╡рд┐рднрд┐рдиреНрди рд╡рд░реНрдЧреЛрдВ рдХреЛ рдмрдЪрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИрдВрдбрд▓рд░ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХрд╛ рдкреНрд░реЗрд╖рдг рдПрдХ рд╢рдмреНрджрдХреЛрд╢ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдХреБрдВрдЬреА рдПрдХ рдкреНрд░рдХрд╛рд░ рд╣реИ, рдорд╛рди рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреА рдПрдХ рд╡рд╕реНрддреБ рдХреЛ рдмрдЪрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╣реИред
рд▓реЙрдЧрд┐рдВрдЧ рд╡рд░реНрдЧ рдХреЗ рд▓рд┐рдП, рдЬреЛ рдиреАрдЪреЗ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдирдЧреЗрдЯ рдкреИрдХреЗрдЬ System.Data / SQLite рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдХреЗ рдирд┐рд░реНрднрд░рддрд╛ рдХреЛ рд╕рдВрддреБрд╖реНрдЯ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред
public class SqliteLogger { private readonly HLTimeCall.Logger _iternalLogger; protected string _connectionString; static object dbLocker = new object(); public SqliteLogger() { InitDb(); var dispatcher = new Dictionary<Type, Action<dynamic>>(); dispatcher[typeof(HLTimeCall.Logger)] = o => LogMainRecord(o); dispatcher[typeof(HLTimeCall.LogItem)] = o => LogCall(o); _iternalLogger = new HLTimeCall.Logger(dispatcher); } private void InitDb() { const string databaseFile = "TimeCallLogs.db"; _connectionString = $"Data Source = {Path.GetFullPath(databaseFile)};"; var dbFileName = Path.GetFullPath(databaseFile); if (!File.Exists(dbFileName)) { SQLiteConnection.CreateFile(dbFileName); Bootstrap(); } } struct DbNames { public const string TMainRecord = "T_MAINRECORD"; public const string TCalllog = "T_CALLLOG"; public const string FLid = "LID"; public const string FLogin = "LOGIN"; public const string FPid = "PID"; public const string FApp = "APP"; public const string FHost = "HOST"; public const string FIp = "IP"; public const string FId = "ID"; public const string FLabel = "LABEL"; public const string FMethod = "METHOD"; public const string FTid = "TID"; public const string FCallTime = "CALL_TIME"; public const string FElapsed = "ELAPSED"; public const string FElapsedMs = "ELAPSED_MS"; public const string FElapsedTicks = "ELAPSED_TICKS"; } public void Bootstrap() { lock (dbLocker) { using (var conn = Connect()) { using (var cmd = conn.CreateCommand()) { cmd.Transaction = conn.BeginTransaction(); cmd.CommandType = System.Data.CommandType.Text; cmd.CommandText = $"CREATE TABLE {DbNames.TMainRecord} ({DbNames.FLid} VARCHAR(45) PRIMARY KEY UNIQUE NOT NULL, {DbNames.FLogin} VARCHAR(45), {DbNames.FPid} INTEGER, {DbNames.FApp} VARCHAR(45), {DbNames.FHost} VARCHAR(45), {DbNames.FIp} VARCHAR(45))"; cmd.ExecuteNonQuery(); cmd.CommandText = $"CREATE TABLE {DbNames.TCalllog} ({DbNames.FId} VARCHAR(45) PRIMARY KEY UNIQUE NOT NULL, {DbNames.FLabel} VARCHAR(45), {DbNames.FLid} VARCHAR(45) NOT NULL, {DbNames.FMethod} VARCHAR(150), {DbNames.FTid} VARCHAR(45), {DbNames.FCallTime} DATETIME, {DbNames.FElapsed} TIME, {DbNames.FElapsedMs} INTEGER, {DbNames.FElapsedTicks} INTEGER)"; cmd.ExecuteNonQuery(); cmd.Transaction.Commit(); } } } } private DbConnection Connect() { var conn = new SQLiteConnection(_connectionString); conn.Open(); return conn; } public HLTimeCall.LogItem Watch(string label = null) { return _iternalLogger.Watch(3, label); } static object CreateParameter(string key, object value) { return new SQLiteParameter(key, value ?? DBNull.Value); } private void LogMainRecord(HLTimeCall.Logger logItem) { lock (dbLocker) { using (var conn = Connect()) { using (var cmd = conn.CreateCommand()) { cmd.Transaction = conn.BeginTransaction(); cmd.CommandType = System.Data.CommandType.Text; cmd.Parameters.Add(CreateParameter(DbNames.FLid, logItem.LId)); cmd.Parameters.Add(CreateParameter(DbNames.FLogin, logItem.Login)); cmd.Parameters.Add(CreateParameter(DbNames.FPid, logItem.Pid)); cmd.Parameters.Add(CreateParameter(DbNames.FApp, logItem.App)); cmd.Parameters.Add(CreateParameter(DbNames.FHost, logItem.Host)); cmd.Parameters.Add(CreateParameter(DbNames.FIp, logItem.Ip)); cmd.CommandText = $"INSERT INTO {DbNames.TMainRecord}({DbNames.FLid},{DbNames.FLogin},{DbNames.FPid},{DbNames.FApp},{DbNames.FHost},{DbNames.FIp})VALUES(:{DbNames.FLid},:{DbNames.FLogin},:{DbNames.FPid},:{DbNames.FApp},:{DbNames.FHost},:{DbNames.FIp})"; cmd.ExecuteNonQuery(); cmd.Transaction.Commit(); } } } } private void LogCall(HLTimeCall.LogItem logItem) { lock (dbLocker) { using (var conn = Connect()) { using (var cmd = conn.CreateCommand()) { cmd.Transaction = conn.BeginTransaction(); cmd.CommandType = System.Data.CommandType.Text; cmd.Parameters.Add(CreateParameter(DbNames.FId, logItem.Id)); cmd.Parameters.Add(CreateParameter(DbNames.FLabel, logItem.Label)); cmd.Parameters.Add(CreateParameter(DbNames.FLid, logItem.Lid)); cmd.Parameters.Add(CreateParameter(DbNames.FMethod, logItem.Method)); cmd.Parameters.Add(CreateParameter(DbNames.FTid, logItem.Tid)); cmd.Parameters.Add(CreateParameter(DbNames.FCallTime, logItem.CallTime)); cmd.Parameters.Add(CreateParameter(DbNames.FElapsed, logItem.Elapsed)); cmd.Parameters.Add(CreateParameter(DbNames.FElapsedMs, logItem.ElapsedMs)); cmd.Parameters.Add(CreateParameter(DbNames.FElapsedTicks, logItem.ElapsedTicks)); cmd.CommandText = $"INSERT INTO {DbNames.TCalllog}({DbNames.FId},{DbNames.FLabel},{DbNames.FLid},{DbNames.FMethod},{DbNames.FTid},{DbNames.FCallTime},{DbNames.FElapsed},{DbNames.FElapsedMs},{DbNames.FElapsedTicks})VALUES(:{DbNames.FId},:{DbNames.FLabel},:{DbNames.FLid},:{DbNames.FMethod},:{DbNames.FTid},:{DbNames.FCallTime},:{DbNames.FElapsed},:{DbNames.FElapsedMs},:{DbNames.FElapsedTicks})"; cmd.ExecuteNonQuery(); cmd.Transaction.Commit(); } } } } }
рдЬреИрд╕рд╛ рдХрд┐ рдкрд╣рд▓реЗ рд╣реА рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдорд╛рдк рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП SqliteLogger рд╡рд░реНрдЧ рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИред рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рдЖрдк рдбреЗрдЯрд╛рдмреЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░реЗрдВ, рдЖрдкрдХреЛ рдЗрд╕реЗ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдХреЛрдб рдХреА рдЕрдзрд┐рдХ рд▓рд╛рдЗрдиреЗрдВ рдЗрд╕рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдкрд┐рдд рд╣реИрдВред рдпрд╣рд╛рдВ рд╡рд░реНрдЧ рд▓рдХрдбрд╝рд╣рд╛рд░рд╛ рдмрдирд╛рдиреЗ рдХреЗ рддрдереНрдп рдХреЛ рд▓реЙрдЧ рдХрд░реЗрдЧрд╛ (рдпрд╣ рд╕рдордЭрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд▓реЙрдиреНрдЪ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рд╛рде рд╣реЛрддрд╛ рд╣реИ), рдкрд░рд┐рдгрд╛рдо T_MAINRECORD рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рд╕рд╣реЗрдЬрд╛ рдЬрд╛рдПрдЧрд╛ред рд╣рдо рддрд╛рд▓рд┐рдХрд╛ T_CALLLOG рдореЗрдВ рдорд╛рдк рдкрд░рд┐рдгрд╛рдо рднреА рд╕рд╣реЗрдЬреЗрдВрдЧреЗред LogMainRecord рдФрд░ LogCall рддрд░реАрдХреЗ рдЗрди рджреЛ рдШрдЯрдирд╛рдУрдВ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИрдВ, рдЙрдирдХреЗ рд╕рдВрджрд░реНрдн рдбрд┐рд╕реНрдкреИрдЪрд░ рд╢рдмреНрджрдХреЛрд╢ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реИрдВред LogItem рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рд╡реЙрдЪ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдХреЗ рдкреНрд░рд╛рд░рдВрдн рдмреНрд▓реЙрдХ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЗрд╕ рддрд░рд╣:
var cMeter = new SqliteLogger(); using (cMeter.Watch(" ")) {
рдЕрдм, рдЗрд╕ рдЙрдкрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рд╕рдВрджрд┐рдЧреНрдз рд╕реНрдерд╛рдиреЛрдВ рдореЗрдВ рдмреНрд▓реЙрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рд╡реНрдпрд╡рд╕реНрдерд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдФрд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдХрд╛рдо рдХрд░рдиреЗ рджреЗрдВред рдЙрд╕рдХреЗ рдмрд╛рдж, рдпрд╣ рдПрдХрддреНрд░рд┐рдд рдЬрд╛рдирдХрд╛рд░реА рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛ рд╣реБрдЖ рд╣реИ, рдЬреЛ рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рд╕рдорд╕реНрдпрд╛ рдХреА рдЬрдЧрд╣ рдХреА рдкрд╣рдЪрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реЛрдЧрд╛ред рдореИрдВ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрдиреЗ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ рдЗрд╕ рддрдХрдиреАрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдиреНрдп рдореИрдЯреНрд░рд┐рдХреНрд╕ рдХреНрдпрд╛ рдПрдХрддреНрд░ рдХрд┐рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ?
рдЖрдкрдХрд╛ рдзреНрдпрд╛рди, рд╕реМрднрд╛рдЧреНрдп рдФрд░ рддреНрд╡рд░рд┐рдд рдХреЛрдб рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж :-)