Ich habe ein sehr einfaches Watchdog-Programm mit 2 Threads. Ein Thread aktualisiert eine lange Variable und der andere Thread liest die Variable. und warnt, wenn es länger als X Sekunden nach dem letzten Update war. Das Problem ist, dass der zweite Thread manchmal (mehr oder weniger einmal am Tag) einen veralteten Wert der Variablen liest.sehr seltsame und schwere Multithread Inkonsistenz Problem C#
Manchmal ist es abgestanden Wert von 3 Sekunden (dh des ersten Thread der lange Variable aktualisiert, aber nach 3 Sekunden des andere Thread nicht den neuen Wert bekommen)
I Sperre verwenden, um zu vermeiden, Multi-Thread-Cache-Problem. Ich habe auch Volatile, Interlock, volatileRead usw. versucht, aber nichts hilft. Die Klasse wird über das Programm VB 6 über COM initiiert. Das Programm ist sehr einfach, also denke ich, dass es ein Fehler in C# ist (vielleicht COM bezogen). Dies ist das Programm:
Können Sie bitte helfen?
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);
}
}
}
Möglicherweise müssen Sie einige Informationen darüber geben, wie 'OnHeartbeatArrive()' aufgerufen wird und insbesondere, wie die übergebene 'heartbeatTime' bestimmt wird. –
Um klarzustellen, demonstriert der veröffentlichte Code mit den WriteLine() - Anweisungen das Problem? –
@michael Wenn ich eine Nachricht vom Server über TCP erhalte, rufe ich OnHeartbeatArrive mit DateTime.Now.ToBinary() auf. Beachten Sie, dass ich dieselbe Variable drucke. Ich sehe, dass es seinen Wert aus dem Update-Thread geändert hat, aber ich sehe einen alten Wert im Lese-Thread. –