我想每秒重新计算一些对象的“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秒表。 可能最好添加一个秒表并分享它,因为我觉得秒表类可能是线程安全的。
你有什么建议?
答案 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;
我认为这是实现它的最快方法之一。此外,它部分是线程安全的(对我来说足够了)。