计时器函数冻结应用程序窗口



以下是我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 冻结的具体原因。任何帮助,不胜感激。提前谢谢你。

现代的写法是:

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) 它似乎用于跟踪当前状态。如果您有状态,则使用单个枚举和字段而不是多个独立布尔值进行建模会更正常。

最新更新