2012-12-14 10 views
7

私がしたいのは、いくつかのメソッドが何らかのタスクを実行しているときにUIがアクティブになり、進行状況バーに作業の進行状況を示したい場合です。BackGroundWorkerでのメソッドの実行とProgressBarの表示

私は方法があり、BackGroundWorkerProgressbarです。 BackGroundWorkerが実行を開始して進行状況を表示するときにメソッドを呼び出す必要があります。このメソッドにはループが含まれています。それで、進捗状況を報告することができます。

だから何ができますか?

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

しかし、機能しません。 Progressbarは更新されていません。 MessageBox「完了」の後にわずかな進捗状況しか示されていません。

+2

parseFiles関数が 'ReportProgress'を呼び出していますか? – McAden

+0

はい。それはそこにあります。申し訳ありません、以前は追加していませんでした。 –

答えて

16

1つのParseFilesメソッド(myBGWorkerに依存する)を使用する代わりに、1つのファイルを解析するループとメソッドを使用します。そのループの進行状況の割合を報告してください:

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

BackGroundWorkerの実行中にボタンを無効にする方法についてコメントしてください。それ以外の場合は問題があります。 –

+0

@ soham.m17確かに、解析を開始するときに 'parseButton.Enabled'プロパティを設定してください。そして、解析が完了したら –

+0

しかし、それは別のスレッドにあります。だから、 'RunWorkerCompleted' eventHandlerに例外がスローされるはずです。しかし、それは投げていないのですか?理由を知ることができますか? –

0

ご質問申し訳ございません。実際にコードは正常に動作します。 myBGWorker.ReportProgress()の引数にProgressbarが表示されず、割合ではなくパーセントでした。それで、それはそれを示していませんでした。ご不便おかけしてすみません。

司会者がこのスレッドを削除します。それ以外の場合は、他の人のチュートリアルになることができます。

0

To。 soham.m17 送信者引数を使用する

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 
    } 
} 
関連する問題