Looping Forever in a Windows Forms Application

后端 未结 4 557
误落风尘
误落风尘 2020-12-30 15:59

I am using Visual C# sand I\'m using a Windows Form rather than a console application. Therefore I\'m not working in Main (), but rather in the Form File. I\'m also very new

4条回答
  •  抹茶落季
    2020-12-30 16:55

    That's a natural question for someone who's coming from a (completely) different background.

    Programming Windows Forms applications is event driven. When a Windows Forms application starts, a form is loaded (check Program.cs file) and there is a Main loop that is hidden from you to concentrate on the important things in your program.

    You don't need to put anything in the Main loop to respond to an event (like a button clicked event). You just handle the button clicked event by creating an event handler for the Click event of the Button). You can use the designer or do that manually in the code.

    When you create a method to handle an event (and as such the method is called an event handler) it is called automatically when the event is raised/triggered. For example a method handler for the Click event for the Button on your form would be called when the user clicked the button.

    This MSDN topic contains all the information you need: Creating Event Handlers in Windows Forms. If you need more clarification, please ask! :)

    UPDATE: Create an event handler just like above and also create a loop in the Form_Loaded event handler. Be sure to call Application.DoEvents(); inside the loop. This way the event handler for the button click can be handled (in the handler add code to modify a boolean that would make the loop's condition false to cancel the loop).

    UPDATE 2: To make this answer more complete, I mention that you should also consider running the loop on a new thread, not the UI one (and therefore avoid needing to use DoEvents, which has its negatives as my peers pointed out). The following example shows how to create a Thread and cancel it on a Button Click:

        System.Threading.Thread t;
        private void Form1_Load(object sender, EventArgs e)
        {
            //create and start a new thread in the load event.
            //passing it a method to be run on the new thread.
            t = new System.Threading.Thread(DoThisAllTheTime);
            t.Start();
        }
    
        public void DoThisAllTheTime()
        {
            while (true)
            {
                //you need to use Invoke because the new thread can't access the UI elements directly
                MethodInvoker mi = delegate() { this.Text = DateTime.Now.ToString(); };
                this.Invoke(mi);
            }
        }
    
        private void button1_Click(object sender, EventArgs e)
        {
            //stop the thread.
            t.Suspend();
        } 
    

    Finally, consider using a BackgroundWorker which encapsulates creating and managing Threads for you.

提交回复
热议问题