WPF - Zła kolejność wykonywania wątków

0

Koledzy problem jest taki:
program wykonuje jakieś obliczenia , w kilku miejscach wyświetla się dodatkowe okno (z komunikatami), potem kolejne zadania, kolejne okna z komunikatami.
Aby okno nie zawieszało się na czas wykonywania zadań dodałem Dispatcher.Invoke do aktualizacji UI w nowym wątku.

Chciałbym aby program wykonywał swoją pracę dopiero jak wątek thread1 sie zakończy.
Niestety to okno z komunikatami pojawia się dopiero jak wykona się cały program, a nie tak jak bym tego chciał (wyswietlenie okna, dopiero działania) czyli jak to widać w kodzie po kolei.

public partial class MainWindow : Window
    {
        public delegate void Action();

        public MainWindow()
        {
            InitializeComponent();
            main_window.Show();
            string[] args = { "self", "c:/tmp/plik.txt" };

            Thread thread1 = new Thread(NotificationFileSent);
            thread1.Start();
            
              //inne czynności//
              Thread.Sleep(3000);
              //inne czynności//
              Thread.Sleep(3000);
             //dopiero po wykonaniu tych operacji wyswietla się okno z thread1 które wywołałem wyżej
        }

        void NotificationFileSent()
        {
            Dispatcher.Invoke(new Action(() =>
            {
                 notification_window notification_window = new notification_window();
                 notification_window.Show();
                 notification_window.lblnotification.Content = "FileSent";
                 Thread.Sleep(TimeSpan.FromSeconds(5));
                 notification_window.Close();
            }));
        }

Dodam jeszcze że próbowałem dać po thread1.Start(); thread1.Join(); ale program wcale nie wyswietla mojego drugiego okna. thread1.Join(1000) wyswietla to okno ale również po wykonaniu operacji niżej.

Warunek konieczny - musi to działać na net framework 3.0
zupełnie nie potrafie sobie z tym poradzic ;/

1

Jak dajesz thread1.Join(); po thread1.Start(), to masz deadlocka, bo blokujesz główny wątek na joinie, a z wątku thread1 próbujesz się dobrać do głównego wątku przez dispatchera który jest zablokowany.

W tym scenariusz który opisałeś ten dodatkowy wątek jest w ogóle nie potrzebny, a tak w ogóle to zamiast robić obliczenia w głównym wątku rób je w nowych wątkach, a główny wątek pozostaw wyłącznie do obsługi UI.

0
neves napisał(a):

W tym scenariusz który opisałeś ten dodatkowy wątek jest w ogóle nie potrzebny, a tak w ogóle to zamiast robić obliczenia w głównym wątku rób je w nowych wątkach, a główny wątek pozostaw wyłącznie do obsługi UI.

Dzięki za odpowiedź. Rozumiem, w takim razie wrzuciłem zarówno metode wyświetlającą okno z komunikatem do wątku (thread1) jak i reszte działań gdzie wyświetla się inne okno (thread2).
W tym momencie po uruchomieniu oba okna wyświetlają się prawidłowo z tym że chciałbym jeszcze ustawić kolejność wykonywania tych wątków. Tzn. najpier thread1 (tam to okno jest 5 sekund i sie zamyka) a PO SKOŃCZENIU dopiero thread2. Oczywiście rozumiem że Join() nie wchodzi w gre. Aktualnie wydaje mi się że kolejność uruchomień wątków jest losowa (który się pierwszy załaduje). Pomożesz?

public MainWindow()
        {
            InitializeComponent();
            
            Thread thread1 = new Thread(NotificationWindow);
            thread1.Start();
                        
            Thread thread2 = new Thread(OtherWork);
            thread2.Start();

void NotificationWindow()
        {
            Dispatcher.Invoke(new Action(() =>
            {
                notification_window notification_window = new notification_window();
                notification_window.Show();
                Thread.Sleep(TimeSpan.FromSeconds(5));
                notification_window.Close();
            }));
            
        }
0

A nie możesz odpalić drugiego wątku na końcu metody NotificationWindow()?

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