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

Problem z obsługą wątków w WPF
MP
  • Rejestracja:prawie 9 lat
  • Ostatnio:około rok
  • Postów:46
0
Kopiuj

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.

edytowany 3x, ostatnio: maxus_pl
M9
  • Rejestracja:ponad 7 lat
  • Ostatnio:prawie 3 lata
  • Postów:52
0

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

MP
Próbowałem z beginInvoke i to samo. Ćwiczę bo kandydując kiedyś na juniora kazali mi napisać apke w WPF wielowątkową. Z tego co rozumiem to beginInvoke uruchamia wątek asynchronicznie nie czekając na inne wątki, więc w moim przypadku na oko nie będzie widać różnicy między tymi dwiema metodami?
abrakadaber
abrakadaber
  • Rejestracja:ponad 12 lat
  • Ostatnio:8 miesięcy
  • Postów:6610
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);


Chcesz pomocy - pokaż kod - abrakadabra źle działa z techniką.
MP
Ok, dzięki, teraz nie zrywa ale rozumiem, że program w ogóle nie działa wielowątkowo. Czyli muszę doczytać temat :)
abrakadaber
abrakadaber
działa wielowątkowo ale to działanie nie ma sensu bo ideą wątku jest aby zamknąć w nim czasochłonne operacje a z głównym wątkiem (np. żeby pokazać wynik) komunikować się jak najrzadziej ponieważ jest to kosztowne. W kodzie, który dałeś nie ma czasochłonnych operacji (te można zasymulować przez Sleep) a jest dużo komunikacji z głównym wątkiem aplikacji

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.