【问题标题】:Issues with using Stopwatch in a thread在线程中使用秒表的问题
【发布时间】:2015-12-14 15:56:04
【问题描述】:

我有一个函数应该每隔 X 秒发生一次,直到 Y 秒过去。
有一个 long TickTime;long Duration; 变量,以及一个用来计算时间的 Stopwatch 对象。
一开始运行的方法是这样的:

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 而不是使用秒表。 当我使用秒表时,谁能解释为什么会发生这种情况?

【问题讨论】:

  • 您应该将答案作为答案发布,而不是将其编辑到问题中。
  • 会的。我可以关闭自己的帖子还是必须等待模组才能这样做?
  • 不要关闭它。只需添加一个答案并将其标记为已回答。
  • 所以我将不得不等待 2 天,因为它说“你不能在 2 天内接受你自己的答案”
  • 是的。这很烦人,但就是这样。

标签: c# multithreading stopwatch


【解决方案1】:

通过更改 if 来解决问题

if (Timer.ElapsedMilliseconds % TickTime == 0)

if (Timer.Elapsed.TotalMilliseconds % TickTime == 0)

为什么有效?我不知道。
似乎 fooStopwatch.ElapsedMilliseconds 应该将保存值返回为 fooStopwatch.Elapsed.TotalMilliseconds 但事实并非如此。

【讨论】:

    猜你喜欢
    • 2011-08-21
    • 1970-01-01
    • 2011-05-05
    • 1970-01-01
    • 1970-01-01
    • 2020-08-26
    • 1970-01-01
    • 2014-01-20
    • 1970-01-01
    相关资源
    最近更新 更多