Почему C # System.Timer замедляет появление форм Windows - PullRequest
0 голосов
/ 10 июля 2019

У меня есть System.Timer с интервалом 15 мс и SynchronizingObject. В нем есть какая-то важная функция (проверка флага и т. Д.). Так что действительно нужно бежать все время. Я понял, когда таймер запускает формы, которые я хочу открыть, нарисованные / загруженные очень плохо и медленно. И не только формы, но и текстовые поля ведут себя так. (Медленное кормление полукокса ...). Кажется, что System.Timer потребляет действительно большое количество ресурсов или работает в том же потоке, что и приложение. Я не знаю.

Это явление действительно разрушает производительность приложения.

Как я могу улучшить его или я должен использовать другой таймер или технику для частой проверки флагов ....?


Вот мой короткий пример, который я использую в коде следующим образом:

    public System.Timers.Timer timer = new System.Timers.Timer();

            timer.Elapsed += timer_Elapsed;
            timer.Interval = 15; 
            timer.AutoReset = false;
            timer.SynchronizingObject = tableLayoutPanel1;
            timer.Start();

    private void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
    {
    timer1.Stop();
    try
    {
        //Read PLC Digital I/O bits.
        ReadDigitalInput(port0TestValue, port2TestValue);

        if (CurrentStatus.HasFlag(PollingState.PLC_READY | PollingState.MS_READY) && (!CurrentStatus.HasFlag(PollingState.ERROR)))
        {
            applicationState = ApplicationState.Locked;
            menuStrip.Enabled = false;

            if (CurrentStatus.HasFlag(PollingState.ACTUALLOT_NOK))
            {
                LotSync();
            }

            if (CurrentStatus.HasFlag(PollingState.ACTUALLOT_OK))
            {
                if (CurrentStatus.HasFlag(PollingState.LOTCHANGE_TRIGGER))
                {
                    LotChange();
                }

                if (CurrentStatus.HasFlag(PollingState.MEASUREMENTSTART_TRIGGER) && !CurrentStatus.HasFlag(PollingState.MEASUREMENT_START))
                {
                    ActiveLot.ActualMeasurement.Reset();
                    GetActualMeasurementInfo();

                    if (CurrentStatus.HasFlag(PollingState.PRODUCT_DATA_AVAILABLE))
                    {
                        ActiveLot.ActualMeasurement.StartMeasurement();
                        try
                        {
                            if (CurrentStatus.HasFlag(PollingState.MEASUREMENT_START))
                            {

                                while (!CurrentStatus.HasFlag(PollingState.MEASUREMENTS_COMPLETE) && !CurrentStatus.HasFlag(PollingState.ERROR))
                                {
                                    ActiveLot.StepToNextChanel();
                                    ActiveLot.MeasureChanel();
                                }

                                if (CurrentStatus.HasFlag(PollingState.ERROR))
                                {
                                    ResetActualMeasurement();
                                }

                                if (CurrentStatus.HasFlag(PollingState.MEASUREMENTS_COMPLETE))
                                {
                                    if (CurrentStatus.HasFlag(PollingState.END_SAMPLE_COLLECTION))
                                    {
                                        SetNewThresholdValues();
                                    }

                                    if (!CurrentStatus.HasFlag(PollingState.ERROR))
                                    {
                                        ActiveLot.Chanels
                                            .Select(item => item).ToList()
                                            .ForEach(item => item.FinalizedTemporaryValues());
                                        SaveActualMeasurementDataIntoSQLDatabase();
                                        DisplayValues();
                                        RestartMeasurement();
                                    }

                                    if (CurrentStatus.HasFlag(PollingState.ERROR))
                                    {
                                        ResetActualMeasurement();
                                    }
                                }
                            }
                        }
                        finally
                        {
                            ActiveLot.ActualMeasurement.StopMeasurement();
                        }
                    }
                }
            }
        }

        if (CurrentStatus.HasFlag(PollingState.ERROR))
        {
            if (ActiveLot.ActualLOTError.IsDescriptionDisplayed == false)
            {
                richTextBoxError.SuspendLayout();
                richTextBoxError.Text = ActiveLot.ActualLOTError.FormatErrorMessage();
                buttonResetError.Visible = true;
                richTextBoxError.ResumeLayout();
            }
        }
    }
    finally
    {
        if (!CurrentStatus.HasFlag(PollingState.PLC_READY))
        {
            applicationState = ApplicationState.UnLocked;
            menuStrip.Enabled = true;
        }

        if (!CurrentStatus.HasFlag(PollingState.ERROR))
        {
            timer1.Start();
        }
    }
}

} }

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...