Подтвердить что ты не робот

Выполнять заданную функцию каждые X секунд

У меня есть приложение Windows Forms, написанное на С#. Следующая функция проверяет, находится ли принтер в сети или нет:

public void isonline()
{
    PrinterSettings settings = new PrinterSettings();
    if (CheckPrinter(settings.PrinterName) == "offline")
    {
        pictureBox1.Image = pictureBox1.ErrorImage;
    }
}

и обновляет изображение, если принтер находится в автономном режиме. Теперь, как я могу выполнить эту функцию isonline() каждые 2 секунды, поэтому, когда я отсоединяю принтер, изображение, отображаемое в форме (pictureBox1), превращается в другое без перезапуска приложения или проверки вручную? (например, нажав кнопку "Обновить", которая запускает функцию isonline())

4b9b3361

Ответ 1

Используйте System.Windows.Forms.Timer.

private Timer timer1; 
public void InitTimer()
{
    timer1 = new Timer();
    timer1.Tick += new EventHandler(timer1_Tick);
    timer1.Interval = 2000; // in miliseconds
    timer1.Start();
}

private void timer1_Tick(object sender, EventArgs e)
{
    isonline();
}

Вы можете вызвать InitTimer() в Form1_Load().

Ответ 2

Самое удобное для начинающих решение:

Перетащите таймер из панели инструментов, дайте ему имя, установите желаемый интервал и установите для параметра "Включено" значение "Истина". Затем дважды щелкните значок Timer и Visual Studio (или все, что вы используете) напишет для вас следующий код:

private void wait_Tick(object sender, EventArgs e)
{
    refreshText(); // Add the method you want to call here.
}

Не нужно беспокоиться о том, чтобы вставить его в неправильный блок кода или что-то в этом роде.

Ответ 3

Вы можете сделать это легко, добавив таймер в свою форму (от дизайнера) и установив его функцию Tick для запуска вашей функции isonline.

Ответ 4

Я загрузил пакет Nuget, который может сделать его настолько простым, вы можете получить его здесь OpenJobScheduler

А вот как начать его использовать

using OpenJobScheduler;

var jobScheduler = new JobScheduler(TimeSpan.FromMinutes(8), new Action(() => {
  //What you want to execute
}));

jobScheduler.Start(); // To Start up the Scheduler

jobScheduler.Stop(); // To Stop Scheduler from Running.

Ответ 5

Ходовой:

    /// <summary>
    /// Usage: var tmr = SetInterval(DoThis, 1000);
    /// Updating the UI: BeginInvoke((Action)(() =>{ //Code Here; }));
    /// </summary>
    /// <returns>Returns a timer object which can be disposed.</returns>
    public static System.Threading.Timer SetIntervalThread(Action Act, int Interval)
    {
        TimerStateManager state = new TimerStateManager();
        System.Threading.Timer tmr = new System.Threading.Timer(new TimerCallback(_ => Act()), state, Interval, Interval);
        state.TimerObject = tmr;
        return tmr;
    }

Regular

    /// <summary>
    /// Usage: var tmr = SetInterval(DoThis, 1000);
    /// Updating the UI: BeginInvoke((Action)(() =>{ //Code Here; }));
    /// </summary>
    /// <returns>Returns a timer object which can be stopped and disposed.</returns>
    public static System.Timers.Timer SetInterval(Action Act, int Interval)
    {
        System.Timers.Timer tmr = new System.Timers.Timer();
        tmr.Elapsed += (sender, args) => Act();
        tmr.AutoReset = true;
        tmr.Interval = Interval;
        tmr.Start();

        return tmr;
    }