锁定两个定时器在不同的对象上

时间:2017-06-08 06:00:55

标签: c# multithreading timer locking

我有几个对象需要在不同时间执行相同的功能。它们的某些对象是互斥的,有些则不是。

简而言之,我只用两个计时器来说明这个简短的例子

这两个计时器并行工作吗?或者我应该使用不同的方法吗?

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可以与它们并行工作。 这是实现它的正确方法吗?

1 个答案:

答案 0 :(得分:0)

这两个计时器是否并行工作?

对于System.Timers.Timer,在ThreadPool线程上引发了Elapsed事件,这意味着事件处理程序可以在parellel上运行。

但是你的lock声明在某种程度上存在问题,你怎么能保证相互排斥?应该锁定同一个对象实例。

object locker = new object();

...

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