У меня есть 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();
}
}
}
}
}