Gdy miałem jeden backgroundworker w programie było ok, losowanie liczb nie zacinało GUI, a progress bar się "ładował". Uruchamianie wątku odbywało się po przyciśnięciu button1:
private void button1_Click(object sender, EventArgs e)
{
button3.Enabled = button1.Enabled = false;
if (backgroundWorker1.IsBusy != true)
{
// Start the asynchronous operation.
button2.Text = "STOP";
backgroundWorker1.RunWorkerAsync();
}
}
Gdy operacje z backgroundworker1 zakończą się, aktywowany jest button3 - sortowanie. I tam kod wygląda niemal identycznie, tylko uruchamiam backgroundworker2:
private void button3_Click(object sender, EventArgs e)
{
button3.Enabled = button1.Enabled = false;
if (backgroundWorker2.IsBusy != true)
{
// Start the asynchronous operation.
button2.Text = "STOP";
backgroundWorker2.RunWorkerAsync();
}
}
W chwili obecnej, podczas wykonywania operacji po odpaleniu backgroundworker1 przyciskiem button1, działa jakby nie było wątku, okno GUI jest zamrożone. Wartość w progressBar1.Value którą ustawiam poprzez e.ProgressPercentage, nie ulega zmianie podczas wykonywania wątku.
Po zakończeniu klikam button3 i rozpoczyna prace backgroundworker2, tam operację mogę teoretycznie przerwać (okno nie jest zamrożone), lecz daje to połowiczny efekt - buttony zmieniają właściwości (visable=false na true), ale już wpisy do textBoxów nie wchodzą. Sam wątek też się nie przerywa, tylko liczy do samego końca (tak, stosuję backgroundWorker2.CancelAsync()).
Obydwa backgroundworkery operują na tej samej tablicy, lecz musi zostać ona utworzona w pierwszym wątku, aby drugi mógł coś z nią robić.