C# 定时器功能冻结应用程序窗口
以下是我的100毫秒延迟计时器代码:C# 定时器功能冻结应用程序窗口,c#,timer,delay,C#,Timer,Delay,以下是我的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; } p
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);
}
我无法找到导致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)它似乎用于跟踪当前状态。如果您有状态,则使用单个枚举和字段而不是多个独立布尔值来建模更为正常。while(ms_countBlockingCollection
。并使用Thread.Sleep
或Task.Wait
。
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;
}
}