0

我目前有一个自定义对象的静态列表(但我也使用 int 列表进行了测试)。我正在用 2 种方法修改此列表:

  1. Button_Click 事件
  2. 每 5 分钟经过的 System.Timers.Timer

问题在于,当应用程序开始并且独立时,这两种方法的 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
4

1 回答 1

0

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

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

由于我试图删除复制的元素,而不是元素本身,该项目未正确删除:C# 中的“List.Remove”不删除项目?

感谢您的所有帮助,并对造成的混乱感到抱歉!

于 2014-09-21T15:23:54.237 回答