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