2017-06-08 26 views
0

我有幾個對象需要在不同的時間執行相同的功能。它們中的一些對象是互斥的,有些則不是。將兩個定時器鎖定在不同的對象上

那麼短,我說明了只有兩個定時器

難道這兩個參數上並行工作這短短的例子嗎?或者我應該使用不同的方法?

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*/ 
    } 
} 

編輯時,Kennyzx答案(我不想寫太多代碼,但我不高於約清楚我想要的東西問):

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(); 
    } 
} 

在這個新的例子Worker_B和Worker_C相互exlusive(因爲timer.Id是相同的)。但是Worker_A可以與他們並行工作。 實現它的正確方法是?

回答

0

做這兩個定時器工作平行?

對於System.Timers.Timer,經過的事件是在一個線程池的線程,這意味着事件處理程序可以在中並行運行提高。

但是您的lock聲明在某種程度上存在問題,您如何保證互斥?應該鎖定在同一個對象實例上。

object locker = new object(); 

... 

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

我更新了添加更詳細的問題。我希望我現在很清楚 – Ozzy

+2

你的代碼作品,但從OO的角度來看,類沒有很好的設計。具體而言,MyTimer的Id屬性和鎖存器陣列用於同步,但它們與必須訪問互斥的真實資源沒有直接關係。在StackExchange中有代碼審查的[站點](https://codereview.stackexchange.com/),你可以在那裏發佈你的代碼並尋求幫助來改進你的代碼。 – kennyzx