C# 每秒重新计算50个对象的“状态”

C# 每秒重新计算50个对象的“状态”,c#,C#,我想每秒重新计算某个对象的策略状态。我不想为此创建计时器,因为同时,从另一个线程,我也可以访问StrategyState属性,对于我的简单问题来说,计时器可能太重了。我自己这样定义StrategyState类型: public enum StrategyState { OnlyKill, Working, ClosingStage1, ClosingStage2, Closed } 我不确定从一个线程写入这样的对象和从另一个线程读取这样的对象是否是线程安

我想每秒重新计算某个对象的策略状态。我不想为此创建计时器,因为同时,从另一个线程,我也可以访问StrategyState属性,对于我的简单问题来说,计时器可能太重了。我自己这样定义StrategyState类型:

public enum StrategyState
{
    OnlyKill,
    Working,
    ClosingStage1,
    ClosingStage2,
    Closed
}
我不确定从一个线程写入这样的对象和从另一个线程读取这样的对象是否是线程安全的

所以我想延迟更新我的StrategyState字段,如下所示:

....
if ( /* State was not updated for one second or more. */ ) {
    RecalculateState()
}
switch (State) {
    .... // Work
如何在一秒钟或更长时间内不更新测试状态而不增加太多延迟

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

您有什么建议?

只需为上次评估时间添加一个日期时间:

private DateTime m_lastStateEvaluation = DateTime.MinValue;
然后

if ((DateTime.Now - m_lastStateEvaluation).TotalSeconds >= 1))
{ 
    // Evaluate state
    m_lastStateEvaluation = DateTime.Now;
}
这不会给操作增加太多时间


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

我已经这样实现了它:

private long recalculateStateTimestamp;
private const long oneSecond = 10000000;

.....
long newTime = DateTime.Now.Ticks;
if (newTime - recalculateStateTimestamp < oneSecond)
{
    return;
}
recalculateStateTimestamp = newTime;
我认为这是实现它最快的方法之一。另外,对我来说,它部分线程是安全的。

你对计时器有什么看法?System.Threading.Timer就可以了。在getter和setter周围加上一些锁,你应该会没事的。