Eines der Dinge, die ich in Multi-Thread-Programmierung schwer verstehen kann, ist die Tatsache, dass, wenn ein Thread eine Zeile erreicht, die WaitOne()
aufruft, woher weiß ich, welche anderen Threads beteiligt sind? Wo oder wie finde ich (oder verstehe) wie das WaitHandle
das Signal empfängt? Zum Beispiel, ich suche jetzt bei diesem Code:Wie finde ich die anderen Threads, die das Signal zurücksenden, wenn ein Thread WaitOne aufruft?
private void RunSync(object state, ElapsedEventArgs elapsedEventArgs)
{
_mutex.WaitOne();
using (var sync = GWSSync.BuildSynchronizer(_log))
{
try
{
sync.Syncronize();
}
catch(Exception ex)
{
_log.Write(string.Format("Error during synchronization : {0}", ex));
}
}
_mutex.ReleaseMutex();
_syncTimer.Interval = TimeBeforeNextSync().TotalMilliseconds;
_syncTimer.Start();
}
ein paar Methoden, wie dies in der Datei Es gibt (das heißt RunThis(), RunThat()). Diese Methoden werden in einem Windows-Dienst ausgeführt und beim Ablauf eines Timers aufgerufen. Jede dieser Methoden sind mit unterschiedlichen Zeiten aufgerufen und eingerichtet wie folgt aus:
//Synchro
var timeBeforeFirstSync = TimeBeforeNextSync();
_syncTimer = new System.Timers.Timer(timeBeforeFirstSync.TotalMilliseconds);
_syncTimer.AutoReset = false;
_syncTimer.Elapsed += RunSync;
_syncTimer.Start();
Ich verstehe, dass, wenn der Timer abgelaufen ist, wird die RunSync
Methode ausgeführt wird. Aber wenn es die WaitOne()
Zeile trifft, wird der Thread blockiert. Aber auf wen wartet es? Welcher "andere" Thread sendet das Signal?
Ich würde "Find Usages" auf der Mutex-Variable ausführen. – usr
@usr Das würde nicht notwendig alle Verwendungen finden, wenn der Mutex benannt wird - aber ja, es ist ein Anfang. Aber mit dem, was wir tun müssen, ist es durchaus möglich, dass es ein (schlechter) Versuch ist, zwei gleichzeitige Ausführungen des Timer-Callbacks zu verhindern. Da es sich jedoch um einen Mutex handelt, ist es viel wahrscheinlicher, dass es mit einem anderen Prozess auf der Maschine synchronisiert wird - es sei denn, der ursprüngliche Autor kannte den Unterschied zwischen einem Monitor und einem Mutex nicht. – Luaan
Nach dem Lesen von @usr-Kommentaren wurde mir klar, dass es andere Timer gibt, die andere Methoden starten, ähnlich wie oben. Ich habe meine Frage neu formuliert, um es besser zu erklären. – Ray