0
我目前有一個靜態自定義對象列表(但我已經用int列表測試過)。我修改名單中2種方法:Timers.Timer中靜態列表<>的內容不反映其他方法
- Button_Click事件
- System.Timers.Timer是每5分鐘 流逝
的問題是,它似乎像列表是兩種方法初始化當應用程序開始並且是獨立的。意思是當我向#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
'列表'不是線程安全的。 –
SLaks
2014-09-21 14:00:14
雖然'列表'不_線程安全,你所描述的似乎不是問題。你能發佈相關的代碼和一個簡單的代碼示例,我們可以重現這個問題嗎?編輯:啊,但它適用於'int'?是的,只是可能是線程問題。嘗試在任何修改或訪問列表的代碼周圍應用「鎖定」。 –
2014-09-21 14:00:16
無法說無代碼,但我懷疑線程安全是每5分鐘更新一次的問題。賽車狀況的機會相當渺茫,我想你可以每次重現它。 – Stilgar 2014-09-21 14:04:41