我正在查看我的同事编写的代码:
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的巨大浪费。
答案 0 :(得分:4)
您可以使用Timer
定期执行,而不会强制线程在该时间内无所事事。您正在使用的读者也可能会在事情发生时公开一些通知您的方法,以便您可以在不需要轮询对象的情况下响应这些事件。
答案 1 :(得分: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();
}
}
}