我有一个假设每X秒发生一次的功能,直到Y秒过去
有一个long TickTime;
和long Duration;
变量,以及一个应该计算时间的秒表对象。
首先,运行的方法是:
public override bool ApplyBehavior(IUnit unit)
{
Timer.Start();
while (Timer.ElapsedMilliseconds < Duration)
if (Timer.ElapsedMilliseconds % TickTime == 0)
ApplyTick(unit);
Timer.Stop();
return true;
}
发生的事情是while
刚刚接管了游戏运行的主题,所以我把它分成了:
public override bool ApplyBehavior(IUnit unit)
{
Thread trd = new Thread(() => ThreadMethod(unit));
trd.Start();
return true;
}
private void ThreadMethod(IUnit unit)
{
Timer.Start();
while (Timer.ElapsedMilliseconds < Duration)
if (Timer.ElapsedMilliseconds % TickTime == 0)
ApplyTick(unit);
Timer.Stop();
}
ApplyTick是一个抽象类的方法,我从中创建了一个以这种方式实现该函数的派生类:
[....]
int Damage { get; private set; }
[....]
protected override void ApplyTick(IUnit unit)
{
Damage += 5;
}
在第一段代码(直到持续时间过去之后才停留的那段代码)之后发生的事情是,调试打印中显示的数字大于100000,基础值为10。
当我改为线程方法时,同样的事情只发生了更大的数字和 它没有让游戏线程陷入困境。
要解决这个问题,我选择了另一种方法,使用Thread.Sleep
private void ThreadMethod(IUnit unit)
{
int timeWaited = 0;
int sleepTime = int.Parse(TickTime.ToString());
while (timeWaited < Duration)
{
Thread.Sleep(sleepTime);
ApplyTick(unit);
timeWaited += sleepTime;
}
}
这确实解决了这个问题,但我觉得如果是的话,最终会出现问题 我使用thread.sleep而不是使用秒表。 任何人都可以解释为什么当我使用秒表时会发生这种情况?
答案 0 :(得分:0)
通过从
转换if来解决问题// Dropdown picker
$('.dropdown-menu').on('click', 'li', function(e) {
var $target = $(e.currentTarget);
/* the rest of your code */
localStorage.setItem('country', $target.text());
});
到
if (Timer.ElapsedMilliseconds % TickTime == 0)
为什么会这样?我不知道。
似乎fooStopwatch.ElapsedMilliseconds应该将保存值返回为fooStopwatch.Elapsed.TotalMilliseconds,但事实并非如此。