cykliczne odświeżanie listboxa

0

Trzymam w listboxie pliki z pewnego folderu, chcę cyklicznie sprawdzać, czy coś nowego się w nim pojawiło. Pomyślałem o odpaleniu timera, który co minutę mi go odświeży. Niestety nie mogę tego zrobić, bo zmian nie może wykonywać na listboxie inny wątek, niż ten, który go stworzył:
Komunikat błędu: Cross-thread operation not valid: Control 'listBox1' accessed from a thread other than the thread it was created on

a oto mój kod:

System.Threading.Timer timer = new System.Threading.Timer(Callback, null, TimeSpan.Zero, TimeSpan.FromSeconds(60));

public void Callback(object state)
        {
                        fillListBox();
        }

 private void fillListBox()
        {
            string[] files = Directory.GetFiles("c:\\test", "*");
            listBox1.Items.Clear();
            foreach (string file in files)
            {

                listBox1.Items.Add(Path.GetFileName(file));              
                
            }
        }

jak pozwolić innemu wątkowi na odświeżanie wartości listboxa? a może zrobić to w inny sposób, niż timer w nowym wątku?

0

pseudokod, poprawić co trzeba by się kompilowało:

public void Callback(object state)
        {
                        if (listBox1.InvokeRequired)
                            listBox1.Invoke(Callback, state);
                        else
                            fillListBox();
        }
0

hmm...
nie do końca rozumiem ten mechanizm i obiekty, na których on pracuje. Mogę poprosić jeszcze o wyjaśnienie, co to dokładnie robi i dlaczego argumetny są takie, a nie inne?

na chwile obecną podkreśla mi cały Invoke, bo oczekuje on pierwszego argumentu System.Delegate, a Callback delegatem nie jest, dodałem więc deklarację Callback na początku klasy, tzn.:

public delegate void Callback(object state);

Podkleśliło mi to samego Callbacka w

 listBox1.Invoke(Callback, state);

jako Ambiguity no i cała deklaracja Timera też staje się błędna, bo callback stał się niewłaściwym argumentem (oczekiwany jest System.Threading.TimeCallback).

0

O jejku. Skoro dodałeś typ delegata Callback kiedy już miałeś metodę o takiej samej nazwie, to nic dziwnego że kompilator się czepia.

        public void Callback(object state)
        {
            if (listBox1.InvokeRequired)
                listBox1.Invoke(new Action<object>(Callback), state);
            else
                fillListBox();
        }

1 użytkowników online, w tym zalogowanych: 0, gości: 1