2014-10-06 40 views
1

我在看我的同事写的代码:是否有更好的方法来计算时间的流逝没有把线程睡眠

long tim = DateTime.Now.Ticks;// get current time in ticks 
long startWait = tim + TimeSpan.TicksPerSecond * 15; // add 15 seconds (in ticks) to current time 

while ((tim < startWait) & !_myReader.ReaderOpen) //_myReader.ReaderOpen is external device 
{ 
    Thread.Sleep(100); // sleep for 100ms 
    tim = DateTime.Now.Ticks; 
} 

出于某种原因,这个代码不看的权利。看起来像把线程挂起并每100ms唤醒一次就是CPU的巨大浪费。

+4

主题。睡眠不应该使用CPU。 – Fredou 2014-10-06 18:32:33

+0

只需检查开始行动的时间以及结束行动的时间并确定差异? – KSdev 2014-10-06 18:34:29

+1

@KSdev他不知道要等多久,直到读者打开。 – Servy 2014-10-06 18:38:30

回答

4

您可以使用Timer定期执行,而不会强制线程在此期间无所事事。您使用的读者也有可能在事件发生时通知您一些方法,以便您可以响应这些事件而无需轮询该对象。

+0

不幸的是,'_myReader'不提供任何事件。我将检查'Timer'类。 – newprint 2014-10-06 18:44:45

0

你也可以做这样的事情是完全一样的事情,但不同

至少可以停止循环时myReader.ReaderOpen成为真正的,如果100ms的是对你很重要

using System; 
using System.Diagnostics; 
using System.Threading; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      const int TimeToWait = 15; 
      var sw = Stopwatch.StartNew(); 
      var mnu = new ManualResetEvent(false); 

      while (sw.Elapsed.Seconds <= TimeToWait) 
      { 
       Console.WriteLine(sw.ElapsedMilliseconds); 
       mnu.WaitOne(100); 
      } 

      Console.ReadKey(); 
     } 
    } 
} 
相关问题