适合webgame“ticks”的计时器

时间:2012-03-30 10:09:15

标签: c# loops web timer

我试图创建一个“滴答”的计时器,并通过一些谷歌帮助创建了这个计时器。 它在控制台中完美运行,但是当我在网站中添加它时,似乎我的计算机正在以完全的能力运行,并且网站加载缓慢且无法正常运行。 我可以使用这个吗?或者我需要重新开始吗?

namespace ticket

{
    class Program
    {
        public static int counttick = 0;
        public static int ticks = 0;
        static void LoopingFunction()
        {
            while (counttick <= 20)
            {
                int dwStartTime = System.Environment.TickCount;

                while (true)
                {

                 if (System.Environment.TickCount - dwStartTime > 1000) break; //1000 milliseconds 

                }

                counttick++;
                if (counttick == 20)
                {

                    ticks++;

                    counttick = 0;
                }
            }
        }

      protected void Page_Load(object sender, EventArgs e)
        {
          Label2.Text = "Ticks: " + Convert.ToString(ticks);

            LoopingFunction();
        }
    }
}`

4 个答案:

答案 0 :(得分:0)

卸下:

while (true)
{
   if (System.Environment.TickCount - dwStartTime > 1000) break; //1000 milliseconds
}

并使用:

System.Threading.Sleep(1000);

答案 1 :(得分:0)

尝试System.Threading。Timer class。

答案 2 :(得分:0)

在Web应用程序中,我不建议使用静态变量,因为您真的不知道IIS何时会回收应用程序池,而静态变量将变为0.而您应该尝试使用持久性存储。并尝试使用System.Threading.Timer类来更新值,可能是数据库表或某个文件。

问候。

答案 3 :(得分:0)

我只想提出另一种方法。我需要一个类似的滴答循环,运行速度约为每秒25帧。我有一个名为ApplicationLoop的类,当构造时会启动一个线程。该线程是我的应用程序循环。 (因此明显的类名。)

所以我有一些常量,以确定我的帧速率和帧跳过回退值。基本上,当任务花费的时间超过40毫秒(1000/25 = 40)时,我会再次遍历所有任务以“赶上”。但我只做了很多次。

private const int MAX_FRAMESKIP = 5;
private const int UPDATE_SKIP_TICKS = 1000 / UPDATE_TICKS_PER_SECOND;
private const int UPDATE_TICKS_PER_SECOND = 25;

我的线程功能:

private void UpdateLoop()
{
    ulong ticks = 0UL;
    _isRunning = true;
    var next = DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond;

    while (_isRunning)
    {
        var now = DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond;
        int loops = 0;

        while ((now > next) && _isRunning && (loops < MAX_FRAMESKIP))
        {
            ProcessTasks(ticks);

            next += UPDATE_SKIP_TICKS;
            loops++;
            ticks++;
        }

        AccurateSleep(1);
    }
}

我的类包含一个Subscribe()函数,它接受一个委托。我将该回调存储到List中,ProcessTasks()函数调用每个订阅的函数。

您可以使用简单的AccurateSleep()调用替换Thread.Sleep(1)函数,但请注意,睡眠的默认时间片大约为15毫秒。

[DllImport("winmm.dll")]
private static extern uint timeBeginPeriod(uint period);

[DllImport("winmm.dll")]
private static extern uint timeEndPeriod(uint period);

private static void AccurateSleep(int sleep)
{
    timeBeginPeriod(1);
    Thread.Sleep(sleep);
    timeEndPeriod(1);
}