Application.Exit() nie działa w BackgroundWorker

0

Mam dziwny problem. Nie wiem czemu, ale Application.Exit() zamiast natychmiast wyłączyć program nic sobie nie robi i przepuszcza dalszy kod. To samo z metodą Stop() w Timerze. Również nic nie robi. Oto kawałek kodu:

 private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            closeTimer = new System.Timers.Timer();
            closeTimer.Elapsed += new System.Timers.ElapsedEventHandler(closeTimer_Elapsed);
            closeTimer.Interval = 1000;
            closeTimer.Enabled = true;
            closeTimer.Start();
            e.Cancel = true;
            try
            {
                this.Visible = false;
            }
            catch (InvalidOperationException)
            { 
            }
        }

        void closeTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
        {
            if (Convert.ToString(rejestr.GetValue("Sending")).Equals("false"))
            {
                MessageBox.Show("1");
                closeTimer.Stop();
                
                Application.Exit();
            }
            else
            {
                MessageBox.Show("2");
                closeTimer.Interval = 10000;
            }
        }

Specjalnie dodałem sobie messagebox'y, żeby wiedzieć co kiedy jest wywoływane. A więc kiedy już wartość z rejestru osiągnie pożadaną wartość, pokazuje mi się wreszczie MessageBox z numerem 1, ale potem pokazują się kolejne box'y bez końca, a Stop() powinno je zatrzymać. I aplikacja nadal działa, mimo wykonania Exit().

Wyjaśnię jaki jest cel tego działania. Czasami program wysyła na serwer pliki ~1-2MB, więc się trochę schodzi. Więc wysyłanie rozgrywa BackgroundWorker, który działa na dodatek na innej formie. Więc właśnie gdy skończy wysyłać, powiadamia o tym rejestr. A powyższy kod jest po to, aby nie przerwać wysyłania, tylko poczekać aż się skończy. Dla wygody użytkownika formę chowam, by myślał, że program się zamknął, a powinien naprawdę zamknąć się po chwili. Co tu może być źle?

1

Nie lepiej użyć Close()?

BackgroundWorker działa w innym wątku - zamykasz go?

0

Po zrobieniu closeTimer.Close() jest to samo. A na końcu metody backgroundWorker1_DoWork mam Application.ExitThread() jednak i tak ciągle ten sam efekt.

EDIT. Teraz gdy posegregowałem kod

private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            closeTimer = new System.Timers.Timer();
            closeTimer.Elapsed += new System.Timers.ElapsedEventHandler(closeTimer_Elapsed);
            closeTimer.Interval = 1000;
            closeTimer.Enabled = true;
            closeTimer.Start();
            e.Cancel = true;
            try
            {
                this.Visible = false;
            }
            catch (InvalidOperationException)
            { 
            }
        }

        void closeTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
        {
            if (Convert.ToString(rejestr.GetValue("Sending")).Equals("false"))
            {
                closeTimer.Close();
                Application.Exit();
            }
            else
            {
                closeTimer.Interval = 10000;
            }
        }

to program przestaje reagować po kliknięciu krzyżyka.

0

proces działa, dopóki którykolwiek z jego wątków działa, a BackgroundWorker to akurat, tak jak napisał MSM, osobny wątek. Application.ExitThread() zakończy tylko główny wątek.
jeśli to nie to, to zastanów się, gdzie jeszcze używasz wątków. Timer to też osobny wątek, co prawda z puli systemowej, ale być może też ma wpływ na zakończenie procesu (wątpię, ale nie znam C# aż tak dobrze); w każdym razie obsługuje IDisposable.

0

Muszę chyba coś zrobić z tym InvalidOperationException(Cross-thread operation not valid: Control 'Form1' accessed from a thread other than the thread it was created on.), i zamiast this.Visible = false zrobić this.Close(), tylko cały czas ten dziwny wyjątek i jakieś cross-operation.

@up No więc jak zakończyć ten wątek backgroundWorkera? Skoro na końcu jego pracy zamyka się.

0
blazej30 napisał(a)

@up No więc jak zakończyć ten wątek backgroundWorkera?

CancelAsync() ?

0

plus z wnętrza bk metody do_work obsłużyć cancelationpending

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