私のプログラムがSQL Serverクエリを実行するときにプログレスバーを表示したい。私はコードの下C# Tutorial - Progress BarSQLクエリを実行するときにプログレスバーを表示
からのコードを使用します。
private Task ProcessData(List<Tuple<int,string>> list, IProgress<ProgressReport> progress)
{
int index = 1;
int totalprogress = list.Count;
var progressreport = new ProgressReport();
return Task.Run(()=> {
for(int i = 0; i < totalprogress; i++)
{
Tuple<int, string> temp = list[i];
int id = temp.Item1;
string address = temp.Item2;
label_autoupdate.Text = string.Format("Processing ...{0}",address);
excuteAutoUpdate(id, address);
progressreport.PercentComplete = i++ * 100/totalprogress;
progress.Report(progressreport);
Thread.Sleep(10);
}
// groupBox_autoupdate.Visible = false;
});
}
private async void button_update_tracking_Click(object sender, EventArgs e)
{
List<Tuple<int, string>> list = new List<Tuple<int, string>>();
//..
var progress = new Progress<ProgressReport>();
progress.ProgressChanged += (o, report) =>
{
progressBar1.Value = report.PercentComplete;
progressBar1.Update();
};
await ProcessData(list, progress);
}
しかし、私は予想通り、この機能は動作しません。私の「リスト」には13のアイテムがありますが、それは約7-8のアイテムしか実行しません。私は必要なすべてのものを得るために「更新」ボタンを何度もクリックする必要があります。私はどのようにプログラムを待って強制的に "excuteAutoUpdate"(この場合)関数を終了し、ループ機能を続行するかわからない。私はマルチスレッドプログラミングには非常に新しいので、理解していないことがたくさんあります。私はバックグラウンドワーカーのようなものを検索しますが、私の場合は適用できません。
解決方法を教えてください。
ありがとう!
あなたが上記のビデオに正確に従っているなら、あなたのコードは 'progressreport.PercentComplete = i ++ * 100/totalprogress;'という行にエラーがあります。ビデオではインデックス++、あなたはi ++を書いています。ループ変数をインクリメントしています。 –
FYIは、 '++ *'が前の値を返すので、 'i * * 100'を使用するので、最初の要素に対して常に0を返します。また、この行を '(i + 1)* 100/totalprogress'に変更するか、ループ自体から' i ++ 'を削除してその行を' ++ i * 100 /あなたがループ内で2回インクリメントしたという事実は、実際には私が二重に増分され、半分がスキップされるためです。 – pinkfloydx33
@ Amey Kamat、@ pinkfloydx33、コメントありがとうございます。この問題は、(i + 1)に変更した後は解決されません。 – ledien