2014-09-21 52 views
0

我目前有一個靜態自定義對象列表(但我已經用int列表測試過)。我修改名單中2種方法:Timers.Timer中靜態列表<>的內容不反映其他方法

  1. Button_Click事件
  2. System.Timers.Timer是每5分鐘
  3. 流逝

的問題是,它似乎像列表是兩種方法初始化當應用程序開始並且是獨立的。意思是當我向#1添加一個元素時,它不反映在#2中。我猜這是因爲Timers.Timer是在一個單獨的線程上啓動的?

在這種情況下,我也試着把一個原始的int。在這種情況下,這兩個數字都會發生變化,並相互反映。問題是由於它是一個動態的對象列表嗎?

你會推薦我做什麼?

謝謝!

對不起,不要提前發佈代碼!我嘗試了鎖定建議,無濟於事。我從來沒有使用它,所以請讓我知道如果我沒有正確使用它。

protected System.Timers.Timer fiveMinutesTimer 
    public static List<int> listInt = new List<int>(); 
    public static int counter = 0; 

    public override void OnLoginCompleted() 
    { 
     fiveMinutesTimer = new System.Timers.Timer(); 
     fiveMinutesTimer.Interval = 300000; 
     fiveMinutesTimer.Elapsed += (sender, e) => OnFiveMinutesTimerElapsed(sender, e, EChatEntryType.ChatMsg); 
     fiveMinutesTimer.Enabled = true; 
    } 

    public override void OnMessage(string message, EChatEntryType type) 
    { 
     //lock (listInt) 
     //{ 
      listInt.Add(3); 
      listInt.Add(3); 
      listInt.Add(3); 

      counter += 3; 

      Console.WriteLine("OnMessage: " + listInt.Count); 
      Console.WriteLine("OnMessage int: " + counter); 
     //} 
    } 

    private void OnFiveMinutesTimerElapsed(object source, System.Timers.ElapsedEventArgs e, EChatEntryType type) 
    { 
     //lock (listInt) 
     //{ 
      listInt.Add(3); 
      counter++; 

      Console.WriteLine("Timer: " + listInt.Count); 
      Console.WriteLine("Timer int: " + counter); 
     //} 
    } 

Triggering OnMessage at 4:59 
OnMessage: 3 
OnMessage int: 3 

OnFiveMinutesTimerElapsed 
Timer: 1 
Timer int: 4 

Triggering OnMessage at 9:59 
OnMessage: 6 
OnMessage int: 7 

OnFiveMinutesTimerElapsed 
Timer: 2 
Timer int: 8 
+0

'列表'不是線程安全的。 – SLaks 2014-09-21 14:00:14

+2

雖然'列表'不_線程安全,你所描述的似乎不是問題。你能發佈相關的代碼和一個簡單的代碼示例,我們可以重現這個問題嗎?編輯:啊,但它適用於'int'?是的,只是可能是線程問題。嘗試在任何修改或訪問列表的代碼周圍應用「鎖定」。 – 2014-09-21 14:00:16

+1

無法說無代碼,但我懷疑線程安全是每5分鐘更新一次的問題。賽車狀況的機會相當渺茫,我想你可以每次重現它。 – Stilgar 2014-09-21 14:04:41

回答

0

我的壞人,這是我的錯誤一直..

這不是複製粘貼錯誤。但是,似乎我混淆了測試用例,並且在嘗試從列表中刪除項目時發生問題,而不是添加它。我有一個類似的問題與另一個非靜態變量很明顯,當這個問題發生在一個靜態變量,我認爲計時器是問題。

該項目未正確刪除,原因是事實,我試圖刪除複製的元素,而不是元素本身:"List.Remove" in C# does not remove item?

感謝您的幫助和混亂對不起!

相關問題