Функция таймера замораживает окно приложения - PullRequest
0 голосов
/ 24 января 2019

Ниже приведен мой код таймера для задержки 100 мс:

public System.Timers.Timer aTimer;

public void SetTimer(object sender, EventArgs e)
{
    aTimer = new System.Timers.Timer(1); // 1ms
    aTimer.Elapsed += OnTimedEvent;
    aTimer.AutoReset = true;
    aTimer.Enabled = true;
}

public void OnTimedEvent(object sender, EventArgs e)
{
    ms_count++;
}

public void delay_ms(UInt32 msPeriod)
{
    ms_count = 0;
    while(ms_count < msPeriod);
}

Я вызываю это из этой функции:

void PASECVGet(object sender, EventArgs e)
{
    if (!SCP.IsOpen) {
        MessageBox.Show("Open the Serial Port");
    } else {
        dataout = "get pase cv";
        delay_ms(100);
        SCP.Write(dataout + "\r");
        blGetPASECV = true;
    }
}

Я не могу найти конкретную причину, которая позволяет моему графическому интерфейсу зависать. Любая помощь приветствуется. Заранее спасибо.

1 Ответ

0 голосов
/ 24 января 2019

Современный способ написать это будет:

async void PASECVGet(object sender, EventArgs e) //Ugh, async void, but events!
{
    if (!SCP.IsOpen) {
        MessageBox.Show("Open the Serial Port");
    } else {
        dataout = "get pase cv";
        await Task.Delay(100);
        SCP.Write(dataout + "\r");
        blGetPASECV = true;
    }
}

Затем отбросьте оставшуюся часть существующего кода. В настоящее время в C # существует множество возможностей, позволяющих вам сосредоточиться на выполняемой работе . Эра ручного создания таймеров, потоков и т. Д. Начинает угасать (надеюсь)

Я также беспокоюсь о blGetPASECV выше, потому что а) он, похоже, использует системы венгерского именования и б) он, кажется, для отслеживания текущего состояния . Если у вас есть состояния, было бы более нормально моделировать это с использованием одного перечисления и поля, а не нескольких независимых логических значений.

...