как работать с таймером в фоновом режиме

#c#

#c#

Вопрос:

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

         btnIntraday.Enabled = false;
        btnStartBackfill.Enabled = false;
        btnStop.Enabled = true;

        if (btnIntraday.Text == "Intraday")
        {
            timerIntraday.Interval = 5000;
            timerIntraday.Enabled = true;
            btnIntraday.Text = "Updating..";
        }
        else if (btnIntraday.Text == "Updating..")
        {
            timerIntraday.Enabled = false;
            btnIntraday.Text = "Intraday";
        }
  

и мой фоновый код

         btnIntraday.Enabled = false;
        btnStartBackfill.Enabled = false;
        btnStop.Enabled = true;

        txtInterval.Text = ddTimeInterval.Value.ToString();
        int inter = (int.Parse(txtInterval.Text)) * multiplyingFactorBackfill;

        try
        {
            bgBackfillDCX.RunWorkerAsync();
        }
        catch (Exception ex)
        {

        }    
  

кто-нибудь, пожалуйста, может сказать мне, как запустить таймер в фоновом режиме.
Заранее спасибо.

Комментарии:

1. Могу я спросить, что делает этот код? как вызвать RunWorkerAsync() сам по себе (рекурсивно)?

Ответ №1:

Вы можете использовать BackgroundWorker.

Обработайте BackgroundWorker.Не трудитесь, чтобы запустить свой таймер.

Обработайте BackgroundWorker.Изменен прогресс для обработки событий синхронизации.

Обработайте BackgroundWorker.RunWorkerCompleted для остановки таймера.

Комментарии:

1. я могу работать в фоновом режиме, но он не запускается автоматически

2. @voipservicesolution: Что вы имеете в виду !??

3. мне нужно непрерывно запускать приложение без зависания. есть ли какой-нибудь способ непрерывно работать в фоновом режиме

4. @voipservicesolution: У вас возникли проблемы с использованием BackgroundWorker?

5. это мой фоновый код btnIntraday. Включено = false; btnStartBackfill. Включено = false; btnStop.Включено = true; txtInterval. Текст = ddTimeInterval.Значение. toString(); int inter = (int.Parse(txtInterval.Text)) * Умножающий коэффициент обратного заполнения; попробуйте {bgBackfillDCX.RunWorkerAsync(); } catch (Исключение ex) { } но он не выполняется непрерывно в таймере, он выполняется непрерывно, но зависает

Ответ №2:

Я думаю, вы хотите сказать, что хотите отключить фоновый код, а затем периодически заставлять ЕГО выполнять некоторую работу. Если это так, вам нужен таймер в фоновом коде, а не во внешнем интерфейсе. Что означает использование другого класса таймера в системе.Таймеры, IIRC. Система.Таймеры.Таймер

Ответ №3:

Если вы настаиваете на том, чтобы таймер работал во внешнем интерфейсе (хотя я этого не рекомендую, я понимаю, что в некоторых сценариях это проще), есть способ (примечание: я предполагаю, что используются Windows Forms):

В следующем коде есть:

  • таймер, ссылающийся на экземпляр System.Windows.Формы.Объект Timer
  • значок уведомления, ссылающийся на систему экземпляров.Windows.Формы.Объект NotifyIcon
  • Метод MainWindow_Resize, связанный с событием изменения размера формы
  • Метод notifyIcon_Click, связанный с событием Click в NotifyIcon

Метод изменения размера if-block выполняется, когда пользователь сворачивает форму (форма нигде не отображается на рабочем столе, а установка ShowInTaskbar в значение false также скрывает ее на панели задач, поэтому она эффективно скрыта).

 private void MainWindow_Resize(object sender, EventArgs e)
{
    if (WindowState == FormWindowState.Minimized)
    {
        this.ShowInTaskbar = false;
        notifyIcon.Visible = true;
    }
}
  

Когда пользователь нажимает значок уведомления, окно формы восстанавливается до прежнего размера и положения, и форма выводится пользователю

 private void notifyIcon_Click(object sender, EventArgs e)
{
    notifyIcon.Visible = false;
    this.WindowState = FormWindowState.Normal;
    this.ShowInTaskbar = true;
    this.BringToFront();
    this.Activate();
}