рдореИрдВ рддреБрд░рдВрдд рдПрдХ рдЖрд░рдХреНрд╖рдг рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рд╣рдорд╛рд░рд╛ рдХреЛрдб .NET рдлреНрд░реЗрдорд╡рд░реНрдХ рдХреЗ рдПрдХ рдЖрднрд╛рд╕реА рд╡рд╛рддрд╛рд╡рд░рдг (рдорд╢реАрди) рдореЗрдВ рдЪрд▓рддрд╛ рд╣реИ, рдЬреЛ рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рдпреЛрдЬрди рдХреЗ рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдкрд░ рдЪрд▓рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдордиреЗ 1-2 рдПрдордПрд╕ рдХреЗ рднреАрддрд░ рднреА рдХрд┐рд╕реА рд╕рдЯреАрдХрддрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдирд╣реАрдВ рдХреАред рдлрд┐рд░ рднреА, рд╣рдо рд▓реМрдХрд┐рдХ рд╕рдЯреАрдХрддрд╛ рдмрдврд╝рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреА рд╢рдХреНрддрд┐ рдореЗрдВ рд╕рдм рдХреБрдЫ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВрдЧреЗред
рдЕрдХреНрд╕рд░ рд╣рдорд╛рд░реЗ рдХрд╛рд░реНрдпрдХреНрд░рдо рдореЗрдВ, рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╕рдордп рдЕрдВрддрд░рд╛рд▓ рдХреЗ рд╕рд╛рде рдХреБрдЫ рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ рдЖрдИрдкреА рдХреИрдорд░реЛрдВ рд╕реЗ рд╕реНрдиреИрдкрд╢реЙрдЯ (рдЫрд╡рд┐рдпреЛрдВ) рдХрд╛ рдПрдХ рдЕрджреНрдпрддрди рдерд╛ред рдЕрдХреНрд╕рд░, рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХрд╛ рд╡реНрдпрд╛рд╡рд╕рд╛рдпрд┐рдХ рддрд░реНрдХ рдбреЗрдЯрд╛ рдЕрдкрдбреЗрдЯ рдХреА рдЖрд╡реГрддреНрддрд┐ рдкрд░ рдХреБрдЫ рд╕реАрдорд╛рдПрдВ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рд╕рдордп рдХреЗ рд▓рд┐рдП 1 рд╕реЗрдХрдВрдб рд╣реИред
рдорд╛рдереЗ рдореЗрдВ рд╕рдорд╛рдзрд╛рди рд╕реНрдиреИрдкрд╢реЙрдЯ рдЕрдиреБрд░реЛрдз рдХреЗ рдмрд╛рдж Thread.Sleep (1000) /Task.Await (1000) рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛ рд╣реИред
static void Getsnapshot() { var rnd = new Random() var sleepMs = rnd.Next(0, 1000); Console.WriteLine($"[{DateTime.Now.ToString("mm:ss.ff")}] DoSomethink {sleepMs} ms"); Thread.Sleep(sleepMs); } while (true) { Getsnapshot(); Thread.Sleep(1000); }
рд▓реЗрдХрд┐рди рд╣рдорд╛рд░реЗ рдСрдкрд░реЗрд╢рди рдХрд╛ рд╢рдмреНрдж рдПрдХ рдЧреИрд░-рдирд┐рдпрддрд╛рддреНрдордХ рдорд╛рддреНрд░рд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рд╕реНрдиреИрдкрд╢реЙрдЯ рд▓реЗрдиреЗ рдХрд╛ рдЕрдиреБрдХрд░рдг рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:
рд╣рдорд╛рд░рд╛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдЪрд▓рд╛рдПрдВ рдФрд░ рдЖрдЙрдЯрдкреБрдЯ рдЪрд▓рд╛рдПрдВ
[15:10.39] DoSomethink 974 ms [15:12.39] DoSomethink 383 ms [15:13.78] DoSomethink 99 ms [15:14.88] DoSomethink 454 ms [15:16.33] DoSomethink 315 ms [15:17.65] DoSomethink 498 ms [15:19.15] DoSomethink 708 ms [15:20.86] DoSomethink 64 ms [15:21.92] DoSomethink 776 ms [15:23.70] DoSomethink 762 ms [15:25.46] DoSomethink 123 ms [15:26.59] DoSomethink 36 ms [15:27.62] DoSomethink 650 ms [15:29.28] DoSomethink 510 ms [15:30.79] DoSomethink 257 ms [15:32.04] DoSomethink 602 ms [15:33.65] DoSomethink 542 ms [15:35.19] DoSomethink 286 ms [15:36.48] DoSomethink 673 ms [15:38.16] DoSomethink 749 ms
рдЬреИрд╕рд╛ рдХрд┐ рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдЕрдВрддрд░рд╛рд▓ рдЬрдорд╛ рд╣реЛрдЧрд╛ рдФрд░ рдЗрд╕рд▓рд┐рдП рд╣рдорд╛рд░реЗ рдЖрд╡реЗрджрди рдХреЗ рд╡реНрдпрд╛рдкрд╛рд░рд┐рдХ рддрд░реНрдХ рдХрд╛ рдЙрд▓реНрд▓рдВрдШрди рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
, 60 1 49.
рдЖрдк рдФрд╕рдд рд╡рд┐рдЪрд▓рди рдХреЛ рдХрдо рдХрд░рдХреЗ рдиреАрдВрдж рдХреЗ рдФрд╕рдд рдХреЛ рдорд╛рдкрдиреЗ рдФрд░ рдиреАрдВрдж рдХреЗ рд╕рдордп рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рд╣рдо рдЕрдкрдиреЗ рд╡реНрдпрд╛рд╡рд╕рд╛рдпрд┐рдХ рддрд░реНрдХ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рдЕрдиреБрд░реЛрдз рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╣рдо рдпрд╣ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдиреЗ рдореЗрдВ рдХрднреА рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реЛрдВрдЧреЗ рдХрд┐ рдпрд╣ рдЬрд╛рдирддреЗ рд╣реБрдП рдХрд┐ рдЕрдиреБрд░реЛрдз 1 рд╕реЗрдХрдВрдб рддрдХ рдкреВрд░рд╛ рд╣реЛ рдЧрдпрд╛ рд╣реИ - рдЖрд╡рд╢реНрдпрдХ рдЕрджреНрдпрддрди рдЕрд╡рдзрд┐ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ рдХрд┐рддрдиреЗ рдорд┐рд▓реАрд╕реЗрдХрдВрдб рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рдиреА рд╣реЛрдЧреАред
, 60 1 62.
рд╕реНрдкрд╖реНрдЯ рд╕рдорд╛рдзрд╛рди рд╣реА рд╕реБрдЭрд╛рд╡ рджреЗрддрд╛ рд╣реИред рдСрдкрд░реЗрд╢рди рд╕реЗ рдкрд╣рд▓реЗ рдФрд░ рдмрд╛рдж рдХреЗ рд╕рдордп рдХреЛ рдорд╛рдкреЗрдВред рдФрд░ рдЙрдирдХреЗ рдЕрдВрддрд░ рдХреА рдЧрдгрдирд╛ рдХрд░реЗрдВред
while (true) { int sleepMs = 1000; var watch = Stopwatch.StartNew(); watch.Start(); Getsnapshot(); watch.Stop(); int needSleepMs = (int)(sleepMs - watch.ElapsedMilliseconds); Thread.Sleep(needSleepMs); }
рдЕрдм рд╣рдорд╛рд░реЗ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЛ рдЪрд▓рд╛рдПрдВред рдпрджрд┐ рдЖрдк рднрд╛рдЧреНрдпрд╢рд╛рд▓реА рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдореЗрдВ рд╕реЗ рдХреБрдЫ рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛ред
[16:57.25] DoSomethink 789 ms [16:58.05] Need sleep 192 ms [16:58.25] DoSomethink 436 ms [16:58.68] Need sleep 564 ms [16:59.25] DoSomethink 810 ms [17:00.06] Need sleep 190 ms [17:00.25] DoSomethink 302 ms [17:00.55] Need sleep 697 ms [17:01.25] DoSomethink 819 ms [17:02.07] Need sleep 181 ms [17:02.25] DoSomethink 872 ms [17:03.13] Need sleep 128 ms [17:03.25] DoSomethink 902 ms [17:04.16] Need sleep 98 ms [17:04.26] DoSomethink 717 ms [17:04.97] Need sleep 282 ms [17:05.26] DoSomethink 14 ms [17:05.27] Need sleep 985 ms
рдЕрдЧрд░ рдореИрдВ рднрд╛рдЧреНрдпрд╢рд╛рд▓реА рд╣реВрдВ рддреЛ рдореИрдВрдиреЗ рдХреНрдпреЛрдВ рд▓рд┐рдЦрд╛? рдХреНрдпреЛрдВрдХрд┐ watch.Start () DoSomethink () рдФрд░ watch.Stop () DoSomethink () рдХреЗ рдмрд╛рдж рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ; рдпреЗ рдСрдкрд░реЗрд╢рди рддрд╛рддреНрдХрд╛рд▓рд┐рдХ рдирд╣реАрдВ рд╣реИрдВ + рд░рдирдЯрд╛рдЗрдо рд╡рд╛рддрд╛рд╡рд░рдг рд╕реНрд╡рдпрдВ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдирд┐рд╖реНрдкрд╛рджрди рд╕рдордп (x) рдХреА рд╕рдЯреАрдХрддрд╛ рдХреА рдЧрд╛рд░рдВрдЯреА рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдУрд╡рд░рд╣реЗрдб рд╣реЛрдЧрд╛ред рд╣рдорд╛рд░рд╛ DoSomethink () рдлрдВрдХреНрд╢рди 0-1000 ms (y) рд╕реЗ рдЪрд▓рддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдРрд╕реЗ рдорд╛рдорд▓реЛрдВ рдореЗрдВ x + y> 1000 рд╣реЛрдиреЗ рдкрд░ рд╕реНрдерд┐рддрд┐рдпрд╛рдВ рдЙрддреНрдкрдиреНрди рд╣реЛ рд╕рдХрддреА рд╣реИрдВ
int needSleepMs = (int)(sleepMs - watch.ElapsedMilliseconds);
рдирдХрд╛рд░рд╛рддреНрдордХ рдорд╛рди рд▓реЗрдЧрд╛ рдФрд░ рд╣рдореЗрдВ рдПрдХ ArgumentOutOfRangeException рдорд┐рд▓ рдЬрд╛рдПрдЧреА, рдХреНрдпреЛрдВрдХрд┐ Thread.Sleep () рд╡рд┐рдзрд┐ рдирдХрд╛рд░рд╛рддреНрдордХ рдорд╛рди рдирд╣реАрдВ рд▓реЗрдирд╛ рдЪрд╛рд╣рд┐рдПред
рдЗрд╕ рддрд░рд╣ рдХреЗ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдХрд┐ рдЬрд░реВрд░рддрдордВрджреЛрдВ рдХреЗ рд╕рдордп рдХреЛ 0 рдкрд░ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдП;
рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, DoSomethink () рдлрд╝рдВрдХреНрд╢рди рдЬрдм рддрдХ рдЖрдк рдЪрд╛рд╣реЗрдВ, рддрдм рддрдХ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЗрдВрдЯ рдореЗрдВ рдХрд╛рд╕реНрдЯрд┐рдВрдЧ рдХрд░рддреЗ рд╕рдордп рд╣рдо рдЪрд░ рдЕрддрд┐рдкреНрд░рд╡рд╛рд╣ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдлрд┐рд░ рд╣рдорд╛рд░реЗ рд╕реЛрдиреЗ рдХрд╛ рд╕рдордп
рдиреАрдВрдж рд╕реЗ рдЕрдзрд┐рдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ;
рдЖрдк рдЗрд╕реЗ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдареАрдХ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
var needSleepMs = sleepMs - watch.ElapsedMilliseconds; if (needSleepMs > 0 && watch.ElapsedMilliseconds <= sleepMs) { needSleepMs = (int)needSleepMs; } else { needSleepMs = 0; } Thread.Sleep(needSleepMs);
рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рд╕рдм рдХреБрдЫ рддреИрдпрд╛рд░ рд╣реИред рд▓реЗрдХрд┐рди 1 рд╕реНрдерд╛рди рдкрд░ рднреА рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреА рдЖрдВрдЦ рдХреЗ рд▓рд┐рдП рдЕрд╕реБрд╡рд┐рдзрд╛ рд╣реЛрддреА рд╣реИред рдФрд░ рдЕрдЧрд░ рдХрд╛рд░реНрдпрдХреНрд░рдо рдореЗрдВ рджрд░реНрдЬрдиреЛрдВ рдРрд╕реЗ рд╕реНрдерд╛рди рд╣реИрдВ, рддреЛ рдХреЛрдб рдПрдХ рдЕрдкрдардиреАрдп рдвреЗрд░ рдореЗрдВ рдмрджрд▓ рдЬрд╛рдПрдЧрд╛ ...
рдЗрд╕реЗ рдареАрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдЕрдкрдиреЗ рдХреЛрдб рдХреЛ рдЗрдирдХреИрдкреНрд╕реБрд▓реЗрдЯ рдХрд░рддреЗ рд╣реИрдВред рдпрд╣рд╛рдВ рдЖрдк рдЗрд╕реЗ рдПрдХ рдЕрд▓рдЧ рд╡рд░реНрдЧ рдореЗрдВ рд░рдЦ рд╕рдХрддреЗ рд╣реИрдВ рдпрд╛ рдХрдХреНрд╖рд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдирд┐рдпрдорд┐рдд рдбрдВрдк рдХреЗ рд░реВрдк рдореЗрдВ рдЧреНрд▓реЛрдмрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рд╕реНрдерд┐рд░ (рдореЗрд░рд╛ рд╕рдВрд╕реНрдХрд░рдг) рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рд╣рдорд╛рд░реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдЗрд╕реЗ рд╕рд░рд▓рддрд╛ рдХреЗ рд▓рд┐рдП рдЫреЛрдбрд╝ рджреЗрдВ, рдЗрд╕реЗ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреНрд▓рд╛рд╕ рдореЗрдВ рдЫреЛрдбрд╝ рджреЗрдВ
public static int NeedWaitMs(Action before, int sleepMs) { var watch = Stopwatch.StartNew(); watch.Start(); before(); watch.Stop(); var needSleepMs = sleepMs - watch.ElapsedMilliseconds; if (needSleepMs > 0 && watch.ElapsedMilliseconds <= sleepMs) return (int) needSleepMs; return 0; }
рд╣рдорд╛рд░реЗ рдЗрдирдкреБрдЯ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХрд╛рд░реНрдп рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд▓рд┐рдВрдХ рдФрд░ рд╣рдорд╛рд░реЗ рдирд┐рдпреЛрдЬрд┐рдд рдкреНрд░рддреАрдХреНрд╖рд╛ рд╕рдордп рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИред рдФрд░ рдпрд╣ рд╕рдордп рд▓реМрдЯрддрд╛ рд╣реИ рдХрд┐ рд╣рдорд╛рд░реЗ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЛ рд╕реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
рдЙрдкрдпреЛрдЧ рдореЗрдВ рдЖрд╕рд╛рдиреА рдХреЗ рд▓рд┐рдП, рд╣рдо рдЕрдкрдиреЗ рдХрд╛рд░реНрдп рдХреЗ рд▓рд┐рдП рдЕрдирд╛рдо рд▓рдВрдмреЛ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рднреА рдкрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреА рдкреВрд░реА рд╕реВрдЪреА рдиреАрдЪреЗ рджреА рдЧрдИ рд╣реИ:
using System; using System.Diagnostics; using System.Threading; namespace ConsoleApp2 { class Program { static void Getsnapshot() { var rnd = new Random(); var sleepMs = rnd.Next(0, 1000); Console.WriteLine($"[{DateTime.Now.ToString("mm:ss.ff")}] DoSomethink {sleepMs} ms"); Thread.Sleep(sleepMs); } static void Main(string[] args) { while (true) { var sleepMs = NeedWaitMs(Getsnapshot, 1000); Console.WriteLine($"[{DateTime.Now.ToString("mm:ss.ff")}] Need sleep {sleepMs} ms {Environment.NewLine}"); Thread.Sleep(sleepMs); } } public static int NeedWaitMs(Action before, int sleepMs) { var watch = Stopwatch.StartNew(); before(); watch.Stop(); var needSleepMs = sleepMs - watch.ElapsedMilliseconds; return needSleepMs > 0 ? (int) needSleepMs : 0; } } }