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

问题描述

我遇到了一个问题,我尝试在倒计时到达一定时间后尝试显示一个显示框,但是由于某种奇怪的原因,尽管它已经超过了它应该出现的初始时间,但它却每秒复制一次。这是我尝试执行的操作,但是现在计时器已停止并且剩余时间列已停止响起。

 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,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();
}

现在,您可以使计时器保持运行状态,并且您的消息只会显示一次。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...