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