2 つのスレッドを持つ非常に単純なウォッチドッグ プログラムがあります。1 つのスレッドが long 変数を更新し、もう 1 つのスレッドがその変数を読み取ります。最後の更新から X 秒以上経過した場合は警告します。問題は、2 番目のスレッドが変数の古い値を読み取ることがある (ほぼ 1 日に 1 回発生する) ことです。
3 秒前の古い値である場合があります (つまり、最初のスレッドが long 変数を更新しましたが、3 秒後に別のスレッドが新しい値を取得しませんでした)。
マルチスレッドキャッシングの問題を回避するために、ロックを使用しています。Volatile、Interlock、volatileRead なども試しましたが、何も役に立ちません。クラスは、COM 経由で VB 6 プログラムを介して開始されます。プログラムはとてもシンプルなので、C#のバグだと思います(多分COM関連)。これはプログラムです:
助けていただけますか?
public class WatchDog
{
long lastDate = DateTime.Now.ToBinary();
private object dateLock = new object();
bool WatchdogActive = true;
int WatchdogTimeoutAlert = 5;
int WatchdogCheckInterval = 6000;
private void WatchdogThread()
{
try
{
while (WatchdogActive)
{
lock (dateLock)
{
DateTime lastHB = DateTime.FromBinary(lastDate);
if ((DateTime.Now.Subtract(lastHB).TotalSeconds > WatchdogTimeoutAlert))
{
Console.WriteLine(" last Date is " + lastDate);
}
}
Thread.Sleep(WatchdogCheckInterval);
}
}
catch (Exception Ex)
{
}
}
private void OnHeartbeatArrive(long heartbeatTime)
{
lock (dateLock)
{
lastDate = heartbeatTime;
Console.WriteLine(" Got Heartbeat lastDate " + lastDate);
}
}
}