出现后每秒出现一个新的消息框

A new message box appears with each second after it appears

我 运行 遇到一个问题,我尝试在倒计时达到特定时间后显示一个显示框,但由于某些奇怪的原因,它每秒都在复制,尽管它已经过了它应该显示的初始时间出现。这是我尝试做的,但现在计时器已停止,剩余时间列已停止运行。

 public partial class Form1 : Form
{
    private List<CSession> sessionlist = new List<CSession>();
    private TimeSpan workingTimeSpan = new TimeSpan();
    private TimeSpan fiveMinutes = new TimeSpan(0,1,0);
    private TimeSpan oneSecond = new TimeSpan(0,0,1);
    public Form1()
    {
        InitializeComponent();
        timer1.Enabled = true;
        timer1.Start();
    }


    private void label1_Click(object sender, EventArgs e)
    {

    }

    private void AddTime_Click(object sender, EventArgs e)
    {
        
        workingTimeSpan += fiveMinutes;

        DisplayWorkingTimeSpan();
    }

    private void DisplayWorkingTimeSpan()
    {
        TimerLabel.Text = workingTimeSpan.ToString();
    }

    private void DecreaseTime_Click(object sender, EventArgs e)
    {
        TimeSpan fiveMinutes = new TimeSpan(0,5,0);
        workingTimeSpan -= fiveMinutes;

        DisplayWorkingTimeSpan();
    }

    private void Confirm_Click(object sender, EventArgs e)
    {
        CSession newSession = new CSession();

        if(PasswordText.Text == "")
        {
            MessageBox.Show("Password not entered");
            return;
        }

        newSession.password = PasswordText.Text;
        newSession.purchased_time = workingTimeSpan;
        newSession.remaining_time = workingTimeSpan;
        newSession.status = "Online";

        sessionlist.Add(newSession);
        PasswordText.Text = "";
        TimerLabel.Text = "";
        workingTimeSpan = new TimeSpan();
    }

    private void DisplayAllSessions()
    {
        listView1.Items.Clear();

        foreach(CSession c in sessionlist)
        {
            string[] row = { c.password, c.purchased_time.ToString(), c.remaining_time.ToString(), c.status };
            ListViewItem i = new ListViewItem(row);
            listView1.Items.Add(i);
        }
    }
    private void timer1_Tick(object sender, EventArgs e)
    {
        foreach(CSession c in sessionlist)
        {
            if (c.remaining_time.TotalMinutes == 5)
            {
                timer1.Stop();
                MessageBox.Show("Time almost up for client.");
                
            }

            if (c.remaining_time.TotalSeconds < 1)
            {
                c.status = "Offline";
            }
           
            if(c.status == "Online")
            {
               c.remaining_time -= oneSecond;
            }

        }

        DisplayAllSessions();
    }

    private void exitToolStripMenuItem_Click(object sender, EventArgs e)
    {
        Close();
    }
}

添加一个在显示消息时切换的标志,这样您就不会再次显示它:

private bool MessageDisplayed = false;

private void timer1_Tick(object sender, EventArgs e)
{
    foreach(CSession c in sessionlist)
    {
        if (c.remaining_time.TotalMinutes == 5 && !MessageDisplayed) // <-- check the flag
        {
            MessageDisplayed = true;
            MessageBox.Show("Time almost up for client.");
            
        }

        if (c.remaining_time.TotalSeconds < 1)
        {
            c.status = "Offline";
        }
       
        if(c.status == "Online")
        {
           c.remaining_time -= oneSecond;
        }

    }

    DisplayAllSessions();
}

现在您可以离开定时器 运行,您的消息将只出现一次。