私は以下のコードフラグメントを別のスレッドからアクセスしています。異なるスレッドはオブジェクトを共有します
try
{
this.RefreshSettings();
DateTime lastChecked = DateTime.Now.AddMilliseconds(-1 * m_Settings.Interval);
while (Run)
{
if ((DateTime.Now - lastChecked).TotalMilliseconds >= this.m_Settings.Interval)
{
lastChecked = DateTime.Now;
if (this.ShouldNotify())
{
object LockObj = new object();
lock (LockObj)
{
this.Notify();
}
}
}
//Thread.Sleep(this.m_Settings.Interval);
}
}
あなたが見ることができるように、私だけの時間ごとに一定間隔(m_settings.Interval)の後に呼び出されるShouldNotify()メソッドをしたいです。しかし、私の問題は、2つ以上のスレッドがNotifyIfNecesarry関数を呼び出した場合、lastChecked変数を共有していることです。したがって、あるスレッドがその値をdateTime.Nowにリセットすると、他のスレッドもその値をリセットします。
どのように各スレッドが独自のlastCheckedを保持するようにそのメソッドを記述できますか? Thread.Sleepの使用はオプションではありません。なぜなら、bool Runの値をfalseに変更すると、ループを即座に終了する必要があるからです。私がthread.Sleepを持っていて、スレッドがスリープしている場合、プログラムはwhile条件をチェックするまで終了しないので、m_settings.Intervalのmak遅延が起こる可能性があります。
間 を共有していないですこのメソッドの他のインスタンスローカル変数はスレッド間で共有されないので、何かが欠けているのですか? – CodingGorilla
このコードはどこですか?スレッドの実行中か、別のクラスにありますか? – Aliostad
@コーディングゴリラ:lastCheckedはローカルです。私はローカル変数がスレッドによって共有されていないことに気づいていませんでした。私は他の何かが問題を引き起こしているに違いないと思う。 – xbonez