У меня очень простая сторожевая программа с 2 потоками.Один поток обновляет длинную переменную, а другой поток читает переменную.и предупредить, если прошло более X секунд с момента последнего обновления.Проблема в том, что иногда (случается один раз в день более или менее) второй поток считывает устаревшее значение переменной.
Иногда это устаревшее значение 3 секунды назад (т.е. первый поток обновил длинную переменную, но через 3 секунды другой поток не получил новое значение)
Я использую блокировкуво избежание проблемы многопоточного кэширования.Я также пробовал Volatile, Interlock, volatileRead и т. Д., Но ничего не помогает.Класс инициируется через программу VB 6 через COM.Программа очень проста, поэтому я думаю, что это ошибка в 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);
}
}
}