Edytowanie UI wykorzystując osobny wątek

0

Witam,
borykam się z pewnym problemem. Napisałem funkcję, która jest wywoływana przez nowy wątek z wykorzystaniem klasy BackgroundWorker. Funkcja działa nieprzerwanie.
Jej zadaniem jest utworzenie w Form1 PictureBox'a lub kilku PictureBox'ów, nic więcej. Oczywiście wywołując funkcję pojawia się błąd, że wątek ten nie ma uprawnień do edytowania UI.
Czytałem trochę nt. klasy Invoke, jednakże nie wiem jak ją zaimplementować, i to dla nieokreślonej liczby obiektów.
Szukam uniwersalnego rozwiązania, które pozwoliło by edytować Form1 z wykorzystaniem osobnego wątku.
Dziękuję za pomoc

1

wywołując funkcję pojawia się błąd

grammar nazi: Błąd nie wywołuje funkcji. Powinno być: „wywołanie funkcji powoduje błąd” albo podobnie.

Czytałem trochę nt. klasy Invoke, jednakże nie wiem jak ją zaimplementować, i to dla nieokreślonej liczby obiektów.

To nie jest klasa, to jest funkcja, i ją się wywołuje.

Szukam uniwersalnego rozwiązania, które pozwoliło by edytować Form1 z wykorzystaniem osobnego wątku.

        private void button1_Click(object sender, EventArgs e)
        {
            backgroundWorker1.RunWorkerAsync();
        }

        private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
        {
            for (int i=0; i<10; i++)
            {
                Thread.Sleep(1000);
                Foo(i);
            }
        }

        private void Foo(int i)
        {
            if (InvokeRequired)
                Invoke(new Action<int>(Foo), i);
            else
            {
                label1.Text = i.ToString();
            }
        }

Pamiętaj jednak, że Invoke jest wydajnościowo drogie. Powoduje wstrzymanie bieżącego wątka na czas wykonania w głównym wątku tego co jest pod Invoke.

Ale to samo można uzyskać jednowątkowo, z wykorzystaniem async/await - i być może w twoim przypadku też można się pozbyć osobnego wątka.

        private async void button1_Click(object sender, EventArgs e)
        {
            for (int i = 0; i < 10; i++)
            {
                await Task.Delay(1000);
                label1.Text = i.ToString();
            }
        }

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