我有几个对象需要在不同时间执行相同的功能。它们的某些对象是互斥的,有些则不是。
简而言之,我只用两个计时器来说明这个简短的例子
这两个计时器并行工作吗?或者我应该使用不同的方法吗?
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是相互排斥的(因为timer.Id是相同的)。但是Worker_A可以与它们并行工作。 这是实现它的正确方法吗?
答案 0 :(得分:0)
这两个计时器是否并行工作?
对于System.Timers.Timer,在ThreadPool线程上引发了Elapsed事件,这意味着事件处理程序可以在parellel上运行。
但是你的lock
声明在某种程度上存在问题,你怎么能保证相互排斥?应该锁定同一个对象实例。
object locker = new object();
...
private void Time_Elapsed(object sender, ElapsedEventArgs e)
{
lock(locker)
{
...