2012-12-14 18 views
7

To, czego chcę, to gdy niektóre metody wykonują niektóre zadania. UI pozostaje aktywny i chcę pokazać postęp prac na pasku postępu.Uruchamianie metody w BackGroundWorker i pokazywanie ProgressBar

Mam metodę, BackGroundWorker i Progressbar. Chcę wywołać metodę, gdy BackGroundWorker zaczyna działać i wyświetlać postęp. Metoda zawiera pętlę. Tak, może zgłosić postęp.

Co można zrobić?

private void Form1_Load(object sender, EventArgs e) 
{ 
    // TODO: This line of code loads data into the 'dataSet1.TBLMARKET' table. You can move, or remove it, as needed. 
    myBGWorker.WorkerReportsProgress = true; 
} 

private void myBGWorker_DoWork(object sender, DoWorkEventArgs e) 
{ 
    parseFiles(); 
} 

private void myBGWorker_ProgressChanged(object sender, ProgressChangedEventArgs e) 
{ 
    myProgressBar.Value = e.ProgressPercentage; 
} 

private void myBGWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
{ 
    MessageBox.Show("Done"); 
} 

private void parseButton_Click(object sender, EventArgs e) 
{ 
    myBGWorker.RunWorkerAsync(); 
} 

public void parseFiles() 
{ 
    for() 
    { 
    //parsing 
    myBGWorker.ReportProgress(...); 
    } 
} 

Ale to nie działa. Progressbar nie aktualizuje się. Tylko niewielki postęp jest wyświetlany po "Gotowe" MessageBox.

+2

Czy twój plik parseFiles wywołuje 'ReportProgress'? – McAden

+0

Tak. Jest tutaj. Przepraszam, że zapomniałem dodać go wcześniej. –

Odpowiedz

16

Zamiast używać jednej metody ParseFiles (która powinna zależeć od myBGWorker) użyj pętli i metody, które analizują jeden plik. Raportuj procent postępu w tej pętli:

private void parseButton_Click(object sender, EventArgs e) 
{ 
    parseButton.Enabled = false; 
    myBGWorker.RunWorkerAsync(); 
} 

private void myBGWorker_DoWork(object sender, DoWorkEventArgs e) 
{ 
    for(int i = 0; i < filesCount; i++) 
    { 
     ParseSingleFile(); // pass filename here 
     int percentage = (i + 1) * 100/filesCount; 
     myBGWorker.ReportProgress(percentage); 
    } 
} 

void myBGWorker_ProgressChanged(object sender, ProgressChangedEventArgs e) 
{ 
    myProgressBar.Value = e.ProgressPercentage; 
} 

void myBGWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
{ 
    parseButton.Enabled = true; 
    MessageBox.Show("Done"); 
} 
+0

Czy możesz skomentować, jak dezaktywować przycisk, gdy uruchomiony jest BackGroundWorker. W przeciwnym razie byłby problem. –

+0

@ soham.m17 z pewnością, po uruchomieniu parsowania ustaw właściwość 'parseButton.Enabled', a gdy przetwarzanie zakończy się –

+0

Ale jest w innym wątku. Powinien więc podać wyjątek w EventHandler 'RunWorkerCompleted'. Ale to nie jest rzucanie? Czy mogę wiedzieć, dlaczego? –

0

Przykro mi z powodu pytania. Właściwie kod działa poprawnie. Nie było wyświetlane wartości Progressbar, ponieważ argumentem w części był ułamek, a nie procent. Więc tego nie pokazywał. Przepraszam za niedogodności.

Moderator może usunąć ten wątek. W przeciwnym razie może to być samouczek dla innych.

0

Do. soham.m17 używanie z argumentem nadawcy

private void myBGWorker_DoWork(object sender, DoWorkEventArgs e) 
{ 
    var worker = sender as BackgroundWorker; 
    for(int i = 0; i < filesCount; i++) 
    { 
     ParseSingleFile(); // pass filename here 
     int percentage = (i + 1) * 100/filesCount; 
     worker.ReportProgress(percentage); // use not myBGWorker but worker from sender 
    } 
}