2017-06-08 4 views
0

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?

Antwort

0

diese beiden Timer Arbeiten parallel tun?

Für System.Timers.Timer, das Elapsed-Ereignis auf einem Threadpool-Thread angehoben, die die Ereignishandler bedeuten auf parellel ausführen können.

Aber Ihre lock Aussage ist irgendwie problematisch, wie können Sie gegenseitige exklusive garantieren? Sollte die gleiche Instanz des Objekts sperren.

object locker = new object(); 

... 

private void Time_Elapsed(object sender, ElapsedEventArgs e) 
{ 
    lock(locker) 
    { 
     ... 
+0

Ich aktualisierte die Frage, die eine ausführlichere hinzufügt. Ich hoffe, ich bin jetzt klar – Ozzy

+2

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

Verwandte Themen