是否有更好的方法来计算传递时间而不让线程进入睡眠状态

时间:2014-10-06 18:25:21

标签: c# multithreading

我正在查看我的同事编写的代码:

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的巨大浪费。

2 个答案:

答案 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();
        }
    }
}