私は現在、カスタム オブジェクトの静的リストを持っています (ただし、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