Почему мой секундомер сбрасывается через 1 секунду? - PullRequest
5 голосов
/ 30 августа 2011

Итак, у меня есть следующий блок кода:

var sw = new Stopwatch();
sw.Start();
while (sw.Elapsed.Seconds<10)
{
    System.Threading.Thread.Sleep(50);
    Console.WriteLine(sw.Elapsed.Milliseconds.ToString() + " ms");
}
sw.Stop();

и на выходе у меня есть

50 ms
101 ms
151 ms
202 ms
253 ms
304 ms
355 ms
405 ms
456 ms
507 ms
558 ms
608 ms
659 ms
710 ms
761 ms
812 ms
862 ms
913 ms
964 ms
15 ms
65 ms
116 ms
167 ms
218 ms

Почему он сбрасывается каждые 1000 мс? Мне нужно подождать 10 секунд, и я не могу использовать Thread.Sleep(10000);, потому что эта сторонняя библиотека, которую я использую, также спит, и она мне нужна, чтобы делать вещи в течение этого времени.

Ответы [ 3 ]

13 голосов
/ 30 августа 2011

Поскольку Stopwatch.Elapsed.Milliseconds просто выводит компонент в миллисекундах прошедшего времени.Это не общее время в миллисекундах.Это ясно из документации.Stopwatch.Elapsed является экземпляром TimeSpan и TimeSpan.Milliseconds состояний:

Получает компонент в миллисекундах интервала времени, представленный текущей структурой TimeSpan.

Если вы хотите вывод в миллисекундах, а вам нужно общее количество миллисекунд, используйте TimeSpan.TotalMilliseconds:

Получает значение текущего TimeSpan структура выражается в целых и дробных миллисекундах.

всегда, всегда, ВСЕГДА проверяйте документацию!

6 голосов
/ 30 августа 2011

вам нужно TotalMilliseconds свойство sw.Elapsed вместо sw.Elapsed.Milliseconds

1 голос
/ 30 августа 2011

Вам необязательно использовать TimeSpan, возвращаемое свойством Elapsed.

StopWatch предоставляет свойство ElapsedMilliseconds напрямую, которое возвращает общее количество миллисекунд как long. Пройдя через свойство Elapsed, чтобы получить TotalMilliseconds, вы получите удвоение. Используйте значение, наиболее подходящее для вас.

...