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

レイテンシをあまり追加せずに、状態が1秒以上更新されなかったことをテストするにはどうすればよいですか?

明らかにストップウォッチを作成することはできますが、さまざまなスレッドのさまざまなオブジェクトについて、約50の状態を完全に更新する必要があることに注意してください。システムに50個のストップウォッチを追加する必要があるかどうかわかりません。おそらく、Stopwatchクラスはスレッドセーフである可能性が高いため、Stopwatchを1つ追加して共有することをお勧めします。

あなたは何を提案できますか?

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タイマーを使用すると、ステートメントを使用するとスレッドの問題が解決されます。また、必要に応じて、1つのタイマーで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;

これは、それを実装するための最速の方法の1つだと思います。また、それは部分的にスレッドセーフです(私にとっては十分です)。

于 2012-11-20T20:22:06.393 に答える