Как правильно завершить поток (программа часы в 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;