以下是我的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冻结的特定原因。任何帮助表示赞赏。预先谢谢你。
答案 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)似乎是为了跟踪当前的状态。如果您有状态,则使用单个枚举和字段(而不是多个独立的布尔值)进行建模会更正常。