计时器功能冻结“应用程序”窗口

时间:2019-01-24 09:57:14

标签: c# timer delay

以下是我的100ms延迟计时器代码:

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;
    }
}

我找不到导致GUI冻结的特定原因。任何帮助表示赞赏。预先谢谢你。

1 个答案:

答案 0 :(得分:2)

现代的写法是:

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,因为a)似乎正在使用系统匈牙利语命名,b)似乎是为了跟踪当前的状态。如果您有状态,则使用单个枚举和字段(而不是多个独立的布尔值)进行建模会更正常。