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 に答える