Ich habe eine Situation, in der ich zum Testen nur meine Timer-Methode (FooMethod) nacheinander ausführen lassen möchte. Im folgenden Beispiel wird FooMethod als Delegat an einen Zeitgeber übergeben. Es gibt viele konkrete Instanzen dieser Klasse. Ich dachte, dass, indem _locker statisch gemacht würde, nur eine Instanz von FooMethod() zu einer Zeit verarbeiten würde. Aber wenn ich die App starte, kommen mehrere Threads gleichzeitig an der TryEnter() Zeile vorbei.Monitor.TryEnter mit generischer Klasse
So füge ich jede Klasse zu einem neuen Timer hinzu. Dies geschieht in einer Schleife für jedes foo Beispiel:
_timers.Add(new Timer(foo.FooMethod, null, 0, 10000));
Und das ist die Klasse, die diese Methode hat:
public class Foo<T>
{
private static readonly object _locker = new object();
public void FooMethod(object stateInfo)
{
// Don't let threads back up; just get out
if (!Monitor.TryEnter(_locker)) { return; }
try
{
// Logic here
}
finally
{
Monitor.Exit(_locker);
}
}
}
Hinweis: Normalerweise _locker ist nicht statisch; Ich möchte nicht, dass der gleiche Thread die Methode eingibt, bevor sie abgeschlossen werden konnte. Ich habe es hier zum Testen auf statisch geändert.
Mein erster Gedanke ist, dass das vielleicht nicht funktioniert, weil die Klasse generisch ist? Und dass jede konkrete Klasse tatsächlich ihre eigene Klasse ist und sie die Variable _locker nicht teilen? Ist das wahr? Wenn das stimmt, wie soll ich die konkreten Klassen eine _locker Variable teilen lassen? Muss ich eine statische _locker-Variable zu einer anderen Klasse hinzufügen, auf die die Foos Zugriff haben?
sehr interessante und gut gestellte Frage. +1 – spender
Beachten Sie, dass der gleiche Thread * kann eine Sperre wieder eingeben (aber nur wenn es natürlich eine Rekursion gibt).Das sind Sperren, die verhindern sollen, dass * verschiedene * Threads dieselbe Ressource verwenden. – phoog
@spender Danke. Und phoog, ich verstehe. Mein Ziel mit der statischen Variable war es, zu verhindern, dass mehrere Threads diese Methode gleichzeitig verarbeiten. Aber das funktioniert nicht. –