2010-12-07 99 views
4

我具有由不同线程访问这个下面的代码片段。 (m_settings.Interval)的时间每个给定的间隔之后被称为不同线程共享的对象

  try 
     {    
      this.RefreshSettings(); 
      DateTime lastChecked = DateTime.Now.AddMilliseconds(-1 * m_Settings.Interval); 

      while (Run) 
      { 
       if ((DateTime.Now - lastChecked).TotalMilliseconds >= this.m_Settings.Interval) 
       { 
        lastChecked = DateTime.Now; 

        if (this.ShouldNotify()) 
        { 
         object LockObj = new object(); 

         lock (LockObj) 
         { 
          this.Notify(); 
         } 
        } 
       } 
       //Thread.Sleep(this.m_Settings.Interval); 
      } 
     } 

正如你所看到的,我只希望ShouldNotify()方法。但是,我的问题是,如果两个或更多线程调用NotifyIfNecesarry函数,它们共享lastChecked变量。因此,如果一个线程将其值重置为dateTime.Now,则其他值也会重置。

如何我写的方法,这样每个线程维护其自己的lastChecked?使用Thread.Sleep不是一个选项,因为当bool Run的值更改为false时,我需要该循环立即退出。如果我有一个thread.Sleep,并且线程正在休眠,程序将不会退出,直到它检查while条件,所以有可能会延迟m_settings.Interval。

+2

之间除非我失去了一些东西共享 的`lastChecked`变量是局部的,但你说这是与共享此方法的其他实例。局部变量不在线程之间共享,所以我错过了什么,或者你是什么? – CodingGorilla 2010-12-07 19:56:14

+0

此代码是什么?它是在线程运行还是在另一个类中? – Aliostad 2010-12-07 19:56:41

回答

1

你应该跳过你的循环,并使用例如System.Timers.Timer。而且你的锁也不合适。它应该在循环之外创建,而不是每个实例。使用锁时,所有线程必须锁定在同一个对象上。

1

它没有任何意义,lock本地创建的对象。所有线程必须在同一个实例上为lock,否则不会有同步。

下面的代码如预期,因为这段代码运行的所有线程都会有自己的本地引用的object一个新创建的实例不起作用。

object LockObj = new object(); 

lock (LockObj) 
{ 
    this.Notify(); 
} 

而且,由于​​是本地值类型,每个线程有它自己的拷贝。

0

我怎么可以编写方法,以便 每个线程维护其自己的 lastChecked

你已经做到了这一点。

编码大猩猩有它的权利。

的lastChecked变量 地方...局部变量不是线程