每秒重新计算50个物体的“状态”

时间:2012-11-20 18:02:26

标签: c#

我想每秒重新计算一些对象的“StrategyState”。我不想为此创建一个Timer,因为同时,从另一个线程,我可以访问“StrategyState”属性(同样,Timer可能对我的简单问题来说太沉重了)。我这样定义了StrategyState类型:

public enum StrategyState
{
    OnlyKill,
    Working,
    ClosingStage1,
    ClosingStage2,
    Closed
}

我不确定从一个线程写入这样的对象并从另一个线程读取是否是“线程安全的”。

所以我想“懒惰更新”我的StrategyState State字段,就像那​​样:

....
if ( /* State was not updated for one second or more. */ ) {
    RecalculateState()
}
switch (State) {
    .... // Work

如果没有添加太多延迟,我如何测试状态是否在一秒钟或更长时间内没有更新?

我显然可以创建秒表,但请注意,我需要为不同线程中的不同对象更新大约50个状态。我不确定是否应该在系统中添加50秒表。 可能最好添加一个秒表并分享它,因为我觉得秒表类可能是线程安全的。

你有什么建议?

2 个答案:

答案 0 :(得分:1)

只需为最后一次评估时间添加DateTime

private DateTime m_lastStateEvaluation = DateTime.MinValue;

然后

if ((DateTime.Now - m_lastStateEvaluation).TotalSeconds >= 1))
{ 
    // Evaluate state
    m_lastStateEvaluation = DateTime.Now;
}

这不会给操作增加太多时间。

顺便说一下,如果使用计时器,使用lock语句将解决任何线程问题。如果你愿意的话,你可以让一个计时器处理所有50个对象。

答案 1 :(得分:-1)

我已经实现了这样:

private long recalculateStateTimestamp;
private const long oneSecond = 10000000;

.....
long newTime = DateTime.Now.Ticks;
if (newTime - recalculateStateTimestamp < oneSecond)
{
    return;
}
recalculateStateTimestamp = newTime;

我认为这是实现它的最快方法之一。此外,它部分是线程安全的(对我来说足够了)。