У меня есть очень простая сторожевая программа с двумя потоками. Один поток обновляет длинную переменную, а другой поток читает эту переменную. и предупреждать, если прошло более 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);
}
}
}
OnHeartbeatArrive()
и, в частности, как определяется переданный емуheartbeatTime
. - person Michael Burr   schedule 27.12.2010