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可以與他們並行工作。 實現它的正確方法是?
我更新了添加更詳細的問題。我希望我現在很清楚 – Ozzy
你的代碼作品,但從OO的角度來看,類沒有很好的設計。具體而言,MyTimer的Id屬性和鎖存器陣列用於同步,但它們與必須訪問互斥的真實資源沒有直接關係。在StackExchange中有代碼審查的[站點](https://codereview.stackexchange.com/),你可以在那裏發佈你的代碼並尋求幫助來改進你的代碼。 – kennyzx