Cała pętla z progress barem powinna być w uruchomiona w tle, czyli w innym wątku.
Skorzystaj z klasy BackgroundWorker
Operacje z pętlą wrzuć do zdarzenia DoWork.
a by uruchomić tego Workera w przycisku dodaj:
private void start_Click(object sender, EventArgs e) //przycisk startu
{
bgwProgressBar.RunWorkerAsync();
}
Natomiast przycisk stop powinien sprawdzić czy proces działa, jeśli tak to go anulować, czyli:
private void stop_Click(object sender, EventArgs e) //przycisk stopu
{
if (bgwProgressBar.IsBusy)
{
bgwProgressBar.CancelAsync();
MessageBox.Show("Zatrzymano");
}
}
Jeśli w takim wątku chcesz uruchomić jakąś metodę która pochodzi np. z głównego wątku aplikacji (już uruchomionego) to możesz go uruchomić poprzez:
this.Invoke(new Action(() => NazwaMetody()));