Почему делает Систему. Поточная обработка. Остановка таймера самостоятельно?

Я делаю маленький тестовый проект, прежде чем я буду использовать System.Threading.Timer в проекте службы Windows. Это работает замечательно, однако остановки таймера самостоятельно после минуты или два.

Полный источник для тестового проекта:

using System;
using System.Windows.Forms;
using System.Threading;

namespace studyTimers {
    public partial class Form1 : Form {
        public Form1() {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e) {
            TimerCallback timerDelegate = new TimerCallback(tick);
            System.Threading.Timer testTimer = new System.Threading.Timer(timerDelegate, null, 1000, 1000);
        }

        void tick(Object obj) {
            if (label1.InvokeRequired) {
                label1.Invoke(new MethodInvoker(() => tick(obj)));
            } else {
                label1.Text = DateTime.Now.ToString();
            }
        }
    }
}

Цель состоит в том, чтобы, очевидно, обновить маркировку с текущим временем. Я замечаю что, обновляя остановки после немного. Почему это было бы?

17
задан Jim Ferrans 4 February 2010 в 02:12
поделиться

2 ответа

Если вам нужен таймер в форме Windows, добавьте в форму System.Windows.Forms.Timer - нет причин использовать System.Threading.Timer , если вам не нужно разрешение лучше, чем 55 мс.

Причина, по которой таймер "останавливается", заключается в том, что он собирается сборщиком мусора. Вы разрешаете ему выходить из области видимости в методе Form1_Load , потому что вы объявляете его только как локальную переменную. Чтобы таймер оставался «живым», он должен быть частным полем в классе формы, чтобы сборщик мусора знал, что оно все еще необходимо.

Другими словами:

public partial class Form1 : Form
{
    private System.Threading.Timer testTimer;

    ...

    public void Form1_Load(object sender, EventArgs e)
    {
        TimerCallback timerDelegate = new TimerCallback(tick);
        testTimer = new System.Threading.Timer(timerDelegate, null, 1000, 1000);
    }
}

Но опять же, в этом случае проще использовать System.Windows.Forms.Timer , который является фактическим компонентом в наборе инструментов, который вы можете просто перетащить в форму. .


Изменить - Как теперь видно из комментариев, если это всего лишь тестовое приложение, а реальное приложение находится в службе Windows, вы не можете использовать System.Windows.Forms.Timer для этого. Только не забудьте, что ваш System.Threading.Timer не выходит за пределы области видимости.

37
ответ дан 30 November 2019 в 11:43
поделиться

Не должно. Есть проблема с вашим кодом? Изменить: Я говорил о таймере, который находится в наборе инструментов.

-1
ответ дан 30 November 2019 в 11:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: