Search code examples
c#winformsbuttontimerstopwatch

C# Stopwatch stop when clicking on disabled button


I got following problem with testing reaction time in C#. When I click earlier reaction button which is still disabled, stopwatch stop on that earlier click. Here's my code:

 private void start_btn_Click(object sender, EventArgs e)
 {  
     stopwatch.Reset();
                for (int i = 3; i > 0; --i)
                {
                    react_btn.Text = i.ToString();
                    Task.Delay(500).Wait();
                    react_btn.Invalidate();
                    react_btn.Enabled = false;
                }
                    react_btn.Text = "Click when red";
                    Task.Delay(random.Next(2000, 5000)).Wait();                    
                    stopwatch.Start();                    
                    react_btn.BackColor = Color.Red;
                    react_btn.Text = "Click!";
                    react_btn.Enabled = true;
   }

private void react_btn_Click(object sender, EventArgs e)
        {
            if (stopwatch.IsRunning)
            {
                stopwatch.Stop();
                timesTested.Add(stopwatch.ElapsedMilliseconds);
                react_btn.BackColor = Color.Yellow;
                react_btn.Text = string.Format("Your time {0} ms", stopwatch.ElapsedMilliseconds);
            }
         }
       

Solution

  • I hope you ended up with something like:

    private async void start_btn_Click(object sender, EventArgs e)
    {
        stopwatch.Reset();
        react_btn.Enabled = false;
        for (int i = 3; i > 0; --i)
        {
            react_btn.Text = i.ToString();
            await Task.Delay(500);
        }
    
        react_btn.Text = "Click when red";
        await Task.Delay(random.Next(2000, 5000));
        stopwatch.Start();
        react_btn.BackColor = Color.Red;
        react_btn.Text = "Click!";
        react_btn.Enabled = true;
    }