Aplikacja się nie kończy. Wątki.

0

Tak stworzona aplikacja (kod poniżej) nie zamknie się pomimo wciśnięcia krzyżyka w oknie. W związku z tym mam dwa pytania:

  1. Czy mimo zamknięcia okna, metoda ThreadProc będzie miała zawsze dostęp do zmiennych a, b?
  2. Czy w momencie zakończenia wywoływania konstruktora Form1() jest wykonywane coś co poinformuje moją klasę, że wypadałoby skończyć zabawę w wątki?
    Proszę o pomoc.
        public Form1()
        {
            InitializeComponent();
            MyClass obj = new MyClass();
        }
    class MyClass
    {
        int a = 10;
        int b = 10;

        public MyClass()
        {
            Thread th = new Thread(ThreadProc);
            th.Start();
        }

        private void ThreadProc()
        {
            a++;
            Thread.Sleep(1000000000);
            b++;
        }
    }
0
  1. Tak, bo nadal istnieje poprawna referencja do obiektu klasy MyClass - this w działającej metodzie ThreadProc.
  2. Są różne sposoby. Możesz np. wysłać sygnał przerwania do wątku w momencie zamykania formy (th.interrupt()) - to spowoduje rzucenie wyjątku przez metodę Sleep (czy też inną, która na coś czeka - np. wait). Możesz też ustawić ten wątek jako background thread(chyba tak to się nazywało) - wtedy w momencie zamknięcia wątku głównego, ten też zostanie ubity. Są też inne możliwości, wait, mutexy i jakieś flagi itp. itd. w zależności od sytuacji.
0

Co do tego, co kolega wyżej mówił to nazywa się IsBackGround :) i jest to właściwość klasy Thread. Musisz ustawić na true, żeby wątek zamykał się wraz z zamknięciem wątku głównego:

Thread t = new Thread(new ThreadStart(testowametoda));
t.Start();
t.IsBackGround = true;

Ten kodzik, bo mi się nudziło :). Pozdrawiam.

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