我目前有一个自定义对象的静态列表(但我也使用 int 列表进行了测试)。我正在用 2 种方法修改此列表:
- Button_Click 事件
- 每 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