在线程中使用秒表的问题

时间:2015-09-17 17:06:33

标签: c# multithreading stopwatch

我有一个假设每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而不是使用秒表。 任何人都可以解释为什么当我使用秒表时会发生这种情况?

1 个答案:

答案 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,但事实并非如此。