C # timer_Tick() обратный отсчет отсчитывается за 2 шага

#c#

#c#

Вопрос:

Я пытаюсь запрограммировать программу, которая открывает форму при нажатии кнопки. В этой форме есть метка с обратным отсчетом. В основной форме есть кнопка, которая выполняет следующие действия:

 private void btnOpen_Click(object sender, EventArgs e)
{
    List<string> ips = new List<string>();

    if (pcTreeView.SelectedNodes.Count > 1)
    {
        foreach (RadTreeNode node in machinesTreeView.SelectedNodes)
        {
            foreach (XmlNode client in xdoc.SelectNodes("/clients/client"))
            {
                if (node.Text == client["clientShortName"].InnerText)
                {
                    string ipAddress = client["clientIP"].InnerText;
                    ips.Add(client["clientIP"].InnerText);
                    clientNodeList.Add(node);
                }
            }
        }

        MsgBox msgbox = new MsgBox();
        msgbox.ipAddressCollection = ips;
        msgbox.Tag = "test";
        msgbox.ShowDialog();
    }
}
  

Затем открывается вторая форма. Код для моего обратного отсчета следующий:

 int timeLeft = 45;
public List<string> ipAddressCollection { get; set; }

private void MsgBox_Load(object sender, EventArgs e)
{
    timer1.Enabled = true;
}

private async void timer1_Tick(object sender, EventArgs e)
{
    timer1.Enabled = false;

    foreach (string ipAddress in ipAddressCollection)
    {
        if (this.Tag.ToString() == "test")
        {
            if (rebootShutdownTime > 0)
            {
                timeLeft = timeLeft - 1;
                infoLabel.Text = "Countdown: "   timeLeft.ToString();
                timer1.Enabled = true;
            }
        }
    }
}
  

Проблема в том,: Обратный отсчет отсчитывается за 2 шага (например 20 — 18 — 16 и т.д. вместо 20 — 19 — 18 — 17 и т.д.). В режиме отладки он считается правильным.

Есть предложения?

Комментарии:

1. Что, если обновлять метку после каждого тика? infoLabel.Refresh();

2. Вероятно, в «release» у вас есть 2 соединения, поэтому он дважды вычитается из TimeLeft. Возможно, вам следует переместить оператор timeLeft = timeLeft - 1 outside the for .

3. foreach выполняется дважды. Проверьте это путем отладки.

4. Ах, потому что у меня есть два элемента в списке. Если бы у меня было 3 элемента, он отсчитал бы 3. Спасибо 🙂

5. Это приложение Winforms или Webforms?

Ответ №1:

Раздел кода под следующей строкой пахнет:

 foreach (string ipAddress in ipAddressCollection)
  

Вы просто уменьшаете значение timeLeft для каждого ipAddress . Так что, если у вас 45 строк в ipAddressCollection TimeLeft, они будут равны нулю даже при первом тике.