定时器相关的 void 调用会导致整个程序出错

Timer-related void call bugs out entire program

好的,下面是代码的重要部分:

public bool open = false;

//CODE FOR CALLING VOID "EverySecond"
var DT = new System.Timers.Timer();     //Yes i am using System.Timers
DT.Elapsed += new ElapsedEventHandler(EverySecond);
DT.Interval = 1000;
/*
    SOME CODE CHANGING SOME UNIMPORTANT TEXTBOXES
*/
DT.Start();

private void EverySecond(object source, ElapsedEventArgs e)
{
    if (pb1.Value < 100)
        pb1.Value += 1;
    sl -= 1;
    tbTime.Text = "Estimated " + sl.ToString() + " seconds left";
    if (pb1.Value >= 100)
        pb1.Value = 100;
    if (pb1.Value == 100 && open == false)
    {
        Form frm6 = new frm6();
        frm6.Show();
        this.Close();
    }
}

所以基本上每次我 运行 这所有的代码 运行 都很好,但后来我来到这段代码 (if (pb1.Value == 100 && open == false)) 并且整个程序冻结并每秒输出 1 Form(由于脚本的当前配置,这是合乎逻辑的)但是我已经尝试了一百万种不同的方法并且它的效果有些相同,它只是向我显示了沙漏光标所有的按钮和文本框都错位了,进度条也消失了,简直一团糟。

我解决了,您需要使用常规的 Forms.Timer,并将“Timer.Elapsed”替换为“Timer.Tick”,并将“Elapsed”从“ElapsedEventHandler”和“中删除” ElapsedEventArgs”像这样:

public bool open = false;

//CODE FOR CALLING VOID "EverySecond"
Timer DT = new Timer();
DT.Tick += new EventHandler(EverySecond);
DT.Interval = 1000;
/*
    SOME CODE CHANGING SOME UNIMPORTANT TEXTBOXES
*/
DT.Start();

private void EverySecond(object source, EventArgs e)
{
    if (pb1.Value < 100)
        pb1.Value += 1;
    sl -= 1;
    tbTime.Text = "Estimated " + sl.ToString() + " seconds left";
    if (pb1.Value >= 100)
        pb1.Value = 100;
    if (pb1.Value == 100 && open == false)
    {
        Form frm6 = new frm6();
        frm6.Show();
        this.Close();
    }
}