Это естественный вопрос для кого-то, кто происходит (совершенно) из другого фона.
Программирование приложений Windows Forms зависит от событий. Когда запускается приложение Windows Forms, загружается форма (проверьте файл Program.cs) и от вас скрывается главный цикл, чтобы сконцентрироваться на важных вещах в вашей программе.
Вам не нужно помещать что-либо в основной цикл, чтобы ответить на событие (например, событие с нажатием кнопки). Вы просто обрабатываете событие нажатия кнопки, создавая обработчик события для события Click кнопки). Вы можете использовать конструктор или сделать это вручную в коде.
Когда вы создаете метод для обработки события (и, как таковой, метод называется обработчиком события), он вызывается автоматически, когда событие инициируется / запускается. Например, обработчик метода для события Click для кнопки в вашей форме будет вызван, когда пользователь нажмет кнопку.
Этот раздел MSDN содержит всю необходимую информацию: Создание обработчиков событий в Windows Forms . Если вам нужно больше разъяснений, пожалуйста, спросите! :)
ОБНОВЛЕНИЕ: Создайте обработчик событий, как описано выше, а также создайте цикл в обработчике событий Form_Loaded. Обязательно вызовите Application.DoEvents (); внутри цикла. Таким образом, обработчик события для нажатия кнопки может быть обработан (в обработчике добавьте код, чтобы изменить логическое значение, которое сделало бы условие цикла ложным для отмены цикла).
ОБНОВЛЕНИЕ 2:
Чтобы сделать этот ответ более полным, я упоминаю, что вам также следует рассмотреть возможность запуска цикла в новом потоке, а не в пользовательском интерфейсе (и, следовательно, избегайте необходимости использовать DoEvents, у которого есть свои недостатки, как указали мои коллеги). В следующем примере показано, как создать поток и отменить его при нажатии кнопки:
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();
}
Наконец, рассмотрите возможность использования BackgroundWorker , который включает в себя создание и управление потоками для вас.