静态列表的内容<>在Timers.Timer中没有反映其他方法

时间:2014-09-21 13:56:34

标签: c# system.timers.timer

我目前有一个自定义对象的静态列表(但我也使用了List of int测试过)。我用2种方法修改了这个List:

  1. Button_Click事件
  2. System.Timers.Timer,每5分钟过去一次
  3. 问题在于,当应用程序开始并且独立时,似乎为两个方法初始化了List。在向#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
    

1 个答案:

答案 0 :(得分:0)

我的坏人,这一直是我的错误..

这不是复制粘贴错误。但是,我似乎混淆了我的测试用例和我尝试从列表中删除项目时出现的问题,而不是添加它。我有一个类似的问题与另一个非静态变量,所以很明显,当这个问题出现一个静态变量时,我认为Timer是问题所在。

该项目未被正确删除,因为我试图删除复制的元素,而不是元素本身:"List.Remove" in C# does not remove item?

感谢您的帮助,对不起感到抱歉!