1

我想每秒重新计算某个对象的“StrategyState”。我不想为此创建一个计时器,因为同时,我可以从另一个线程访问“StrategyState”属性(另外,对于我的简单问题来说,计时器可能太重了)。我以这种方式自己定义了 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 个秒表。可能,最好添加一个 Stopwatch 并共享它,因为我猜 Stopwatch 类可能是线程安全的。

你有什么建议?

4

2 回答 2

1

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

private DateTime m_lastStateEvaluation = DateTime.MinValue;

接着

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

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

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

于 2012-11-20T18:09:42.507 回答
-1

我已经这样实现了:

private long recalculateStateTimestamp;
private const long oneSecond = 10000000;

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

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

于 2012-11-20T20:22:06.393 回答