Как правильно завершить поток (программа часы в Label) - C#

Узнай цену своей работы

Формулировка задачи:

Здравствуйте, есть простая многопоточная программа - на форме в Label отображается время (программа во вложении). Программа работает, но есть проблема с завершением программы. Если просто нажать на крестик, то программа вылетает с ошибкой. А если сначала нажать на кнопку "Остановить поток" и потом на крестик, тогда все правильно завершается.

Вопрос:

почему программа некорректно завершается, когда я нажимаю на крестик, ведь код на событие кнопки и на крестике (Form1_FormClosing) один и тот же.
namespace MyExp
{
    public partial class Form1 : Form
    {
        Thread thread1;
        private MyTime worker;
 
        public Form1()
        {
            InitializeComponent();
        }
 
        private void Form1_Load(object sender, EventArgs e)
        {
            label1.Text = DateTime.Now.ToString("HH:mm:ss");
 
            worker = new MyTime();
            worker.TimeChanged += IzmTime;
            worker.WorkCompleted += StopTime;
 
            thread1 = new Thread(worker.metod1);
            thread1.Start();
        }

        private void IzmTime()
        {
 
            Action action = () =>
            {
                label1.Text = DateTime.Now.ToString("HH:mm:ss");
            };
            Invoke(action);
        }

        private void StopTime()
        {
            worker.Cancel();
        }
 
        private void Form1_FormClosing(object sender, FormClosingEventArgs e)  //++
        {
             StopTime();
        }
 
        private void btn_StopTime_Click(object sender, EventArgs e)
        {
             StopTime();
        }
 
    }
 
    class MyTime
    {
        public event Action TimeChanged;  //событие
        public event Action WorkCompleted;  //событие
 
        public bool _canceled = false;
 
        public void Cancel()
        {
            _canceled = true;
        }

        public void metod1()
        {
            while (true)
            {
                if (_canceled)
                {
                    MessageBox.Show("Поток остановлен");
                    break;
                }
                Thread.Sleep(1000);
                TimeChanged();
            }
            WorkCompleted(); // конец
 
        }
    }
}

Решение задачи: «Как правильно завершить поток (программа часы в Label)»

textual
Листинг программы
thread1.IsBackground = true;

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

8   голосов , оценка 3.875 из 5