C# 定时器功能冻结应用程序窗口

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

以下是我的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);
}

我无法找到导致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_count是否?等待条件为真。。。直到ms_count达到msperiod的值,而msperiod会阻止线程。我正在尝试让一个存储传入指令的处理程序将它们保存在缓冲区中,然后每100毫秒执行一次。我建议使用
BlockingCollection
。并使用
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;
    }
}