Как правильно завершить поток (программа часы в 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;
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д