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

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

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

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

Вопрос:

почему программа некорректно завершается, когда я нажимаю на крестик, ведь код на событие кнопки и на крестике (Form1_FormClosing) один и тот же.
Листинг программы
  1. namespace MyExp
  2. {
  3. public partial class Form1 : Form
  4. {
  5. Thread thread1;
  6. private MyTime worker;
  7. public Form1()
  8. {
  9. InitializeComponent();
  10. }
  11. private void Form1_Load(object sender, EventArgs e)
  12. {
  13. label1.Text = DateTime.Now.ToString("HH:mm:ss");
  14. worker = new MyTime();
  15. worker.TimeChanged += IzmTime;
  16. worker.WorkCompleted += StopTime;
  17. thread1 = new Thread(worker.metod1);
  18. thread1.Start();
  19. }
  20.  
  21. private void IzmTime()
  22. {
  23. Action action = () =>
  24. {
  25. label1.Text = DateTime.Now.ToString("HH:mm:ss");
  26. };
  27. Invoke(action);
  28. }
  29.  
  30. private void StopTime()
  31. {
  32. worker.Cancel();
  33. }
  34. private void Form1_FormClosing(object sender, FormClosingEventArgs e) //++
  35. {
  36. StopTime();
  37. }
  38. private void btn_StopTime_Click(object sender, EventArgs e)
  39. {
  40. StopTime();
  41. }
  42. }
  43. class MyTime
  44. {
  45. public event Action TimeChanged; //событие
  46. public event Action WorkCompleted; //событие
  47. public bool _canceled = false;
  48. public void Cancel()
  49. {
  50. _canceled = true;
  51. }
  52.  
  53. public void metod1()
  54. {
  55. while (true)
  56. {
  57. if (_canceled)
  58. {
  59. MessageBox.Show("Поток остановлен");
  60. break;
  61. }
  62. Thread.Sleep(1000);
  63. TimeChanged();
  64. }
  65. WorkCompleted(); // конец
  66. }
  67. }
  68. }

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

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

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


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

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

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

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут