Ich habe mehrere Objekte, die die gleiche Funktion erfordern, um zu unterschiedlichen Zeiten ausgeführt werden. Einige Objekte von ihnen sind gegenseitig exklusiv, andere nicht.Sperre zwei Timer auf verschiedenen Objekt
So kurz, ich veranschaulichen dieses kurze Beispiel mit nur zwei Timer
diese beiden Timer auf parallel arbeiten Sie? Oder sollte ich einen anderen Ansatz verwenden?
class MyTimer:Timer
{
private static int count=0;
public int Id {get; private set;}
public MyTimer(){ Id= count++;}
}
...
object[] lockers = new object[2]{new object(), new object()};
MyTimer[] timers = new MyTimer[2]{ new MyTimer(), new MyTimer()};
...
/* somewhere */
timers[0].Elapsed += Time_Elapsed;
timers[1].Elapsed += Time_Elapsed;
timers[0].Start();
timers[1].Start();
...
private void Time_Elapsed(object sender, ElapsedEventArgs e)
{
MyTimer timer = sender as MyTimer;
lock(lockers[timer.Id])
{
/* part of code depends on timer.Id*/
}
}
EDIT NACH Kennyzx Antwort (ich will nicht zu viel Code schreiben, aber ich war mehr als etwa nicht klar, was ich fragen wollte):
interface IWorker
{
void DoSomething();
}
class MyTimer:Timer
{
public int Id {get; private set;}
public IWorker Worker;
public MyTimer(int id){ Id=id;}
}
...
object[] lockers = new object[2]{new object(), new object()};
MyTimer[] timers = new MyTimer[3]{ new MyTimer(0), new MyTimer(1),new MyTimer(1)};
...
/* somewhere */
timers[0].Elapsed += Time_Elapsed;
timers[1].Elapsed += Time_Elapsed;
timers[2].Elapsed += Time_Elapsed;
timers[0].Worker = Worker_A; // implement IWorker
timers[1].Worker = Worker_B; // implement IWorker
timers[2].Worker = Worker_C; // implement IWorker
timers[0].Start(); timers[1].Start(); timers[2].Start();
...
private void Time_Elapsed(object sender, ElapsedEventArgs e)
{
MyTimer timer = sender as MyTimer;
lock(lockers[timer.Id])
{
timer.Worker.DoSomething();
}
}
In diesem neuen Beispiel Worker_B und Worker_C sind für beide Seiten exlusive (weil timer.Id ist das gleiche). Aber Worker_A kann parallel mit ihnen arbeiten. Ist es richtig, es zu erreichen?
Ich aktualisierte die Frage, die eine ausführlichere hinzufügt. Ich hoffe, ich bin jetzt klar – Ozzy
Sie Code funktioniert, aber die Klassen sind nicht gut, aus einer OO-Perspektive. Insbesondere die ID-Eigenschaft von MyTimer und das Spacer-Array dienen dem Zweck der Synchronisation, sie stehen jedoch nicht in direktem Zusammenhang mit den realen Ressourcen, auf die gegenseitig exklusiv zugegriffen werden muss. Es gibt [eine Site] (https://codereview.stackexchange.com/) für die Code-Überprüfung in StackExchange. Sie können Ihren Code dort posten und um Hilfe bitten, um Ihren Code zu verbessern. – kennyzx