2012-12-14 5 views
7

Quello che voglio è quando alcuni metodi eseguono alcune attività L'interfaccia utente si mantiene attiva e voglio mostrare l'avanzamento del lavoro in una barra di avanzamento.Esecuzione di un metodo in BackGroundWorker e Visualizzazione di ProgressBar

Ho un metodo, uno BackGroundWorker e uno Progressbar. Voglio chiamare il metodo quando BackGroundWorker si avvia e mostra l'avanzamento. Il metodo contiene un ciclo. Quindi, può segnalare i progressi.

Quindi, cosa si può fare?

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(...); 
    } 
} 

Ma non funziona. Progressbar non si sta aggiornando. Solo un piccolo progresso viene mostrato dopo il MessageBox "Fatto".

+2

È la vostra funzione parseFiles chiamando 'ReportProgress'? – McAden

+0

Sì. È lì. Mi dispiace, ho dimenticato di aggiungerlo in precedenza. –

risposta

16

Invece di utilizzare un metodo ParseFiles (che dovrebbe dipendere da myBGWorker) utilizzare il ciclo e il metodo che analizzano un file. Segnala la percentuale di progresso in quel ciclo:

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

Potete commentare come disattivare il pulsante quando BackGroundWorker è in esecuzione. Altrimenti ci sarebbe problema. –

+0

@ soham.m17 sicuro, basta impostare la proprietà 'parseButton.Enabled' quando si inizia l'analisi, e quando l'analisi è completata –

+0

Ma è in Thread diverso. Quindi dovrebbe lanciare un'eccezione in eventHandler di 'RunWorkerCompleted'. Ma non sta lanciando? Posso sapere perché? –

0

Mi dispiace per la domanda. In realtà il codice funziona bene. Non stava mostrando il Progressbar come argomento in myBGWorker.ReportProgress() era frazione e non percentuale. Quindi, non lo stava mostrando. Ci dispiace per l'inconvenienza.

Il moderatore può eliminare questo thread. Altrimenti può essere un tutorial per gli altri.

0

a. soham.m17 utilizza con argomento mittente

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 
    } 
}