2010-12-07 441 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變量 地方...局部變量不是線程