Problem z obsługą wątków w WPF

0

namespace Watki_Cwiczenia
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void button_Click(object sender, RoutedEventArgs e)
        {
            Thread watek1 = new Thread(UzupelnijListe);
            watek1.Start();
        }

        private void listBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
        }

        private void button_Click2(object sender, RoutedEventArgs e)
        {
            Thread watek2 = new Thread(UzupelnijListe2);
            watek2.Start();
        }

        private void listBox1_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
        }

        public void UzupelnijListe()
        {
            int licznik = 0;
            for (int i = 0; i < 100000; i++)
            {
                    try
                    {
                        licznik++;
                        if (licznik > 10)
                        {
                            listBox.Dispatcher.Invoke(delegate { listBox.Items.Clear(); });
                            licznik = 0;
                        }

                        listBox.Dispatcher.Invoke(delegate { listBox.Items.Add("Item " + i.ToString()); });
                    }

                    catch (Exception e)
                    {
                        System.Windows.MessageBox.Show("Anulowano, poniżej opis wyątku: \n \n" + e);
                        break;
                    }
            }
        }

        public void UzupelnijListe2()
        {
            int licznik = 0;
            for (int i = 200; i < 30000; i++)
            {
                try
                {
                    licznik++;
                    if (licznik > 10)
                    {
                        listBox1.Dispatcher.Invoke(delegate { listBox1.Items.Clear(); });
                        licznik = 0;
                    }

                    listBox1.Dispatcher.Invoke(delegate { listBox1.Items.Add("Item " + i.ToString()); });
                }

                catch (Exception e)
                {
                    System.Windows.MessageBox.Show("Anulowano, poniżej opis wyątku: \n \n" + e);
                    break;
                }
            }
        }
    }
}

Proszę nakierować mnie jaki robię błąd w tej aplikacji. Chcę sobie poćwiczyć wielowątkowość. Program niby działa, obydwie listy uzupełniają się "niezależnie" ale podczas tych operacji program tnie się, chodzi ale niepłynnie.

0

WPF nie jest najlepszy do ćwiczeń wielowątkowych.
Możesz spróbować użyć BeginInvoke(...) zamiast Invoke(...).

1

ale Twój kod nie ma sensu ponieważ i tak wszystkie operacje robisz w wątku głównym. Wielowątkowość ma sens jeśli znaczna część operacji jest przeprowadzana poza wątkiem głównym a samo "wyświetlanie" w wątku głównym nie zajmuje jakichś 90% (albo i więcej) czasu wątku. Wstaw sobie w każdy przebieg pętli opóźnienie np. 500ms Thread.Sleep(500);

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