Выполнять заданную функцию каждые X секунд
У меня есть приложение Windows Forms, написанное на С#. Следующая функция проверяет, находится ли принтер в сети или нет:
public void isonline()
{
PrinterSettings settings = new PrinterSettings();
if (CheckPrinter(settings.PrinterName) == "offline")
{
pictureBox1.Image = pictureBox1.ErrorImage;
}
}
и обновляет изображение, если принтер находится в автономном режиме. Теперь, как я могу выполнить эту функцию isonline()
каждые 2 секунды, поэтому, когда я отсоединяю принтер, изображение, отображаемое в форме (pictureBox1
), превращается в другое без перезапуска приложения или проверки вручную? (например, нажав кнопку "Обновить", которая запускает функцию isonline()
)
Ответы
Ответ 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;
}