我想在我的程序执行某些SQL Server查询时显示进度栏。我使用的代码C# Tutorial - Progress Bar执行某些SQL查询时显示进度条
下面的代码:
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”(在这种情况下)完成,然后继续循环功能。我对n多线程编程很陌生,所以有很多我不明白的东西。我搜索一些像背景工作者的东西,但我不能将它应用于我的案例。
你能告诉我如何解决它吗?
谢谢你!
如果您确切地遵循了您提到的视频,那么您的代码在'progressreport.PercentComplete = i ++ * 100/totalprogress;'行上有错误。在视频中,它是索引++,你已经写了i ++。您正在增加循环变量。 –
仅供参考您的百分比总是会为第一个元素返回零,因为您使用'+++ 100',这将是'0 * 100',因为++ ++返回之前的值。你也增加了两次(这里和第三学期的循环中)把这行改为'(i + 1)* 100/totalprogress'或者从循环中删除'i ++',并把那行改为'++ i * 100/totalprogress'你在循环中增加两次的原因是为什么它只能运行其中的一部分,因为事实上我会加倍增加,一半跳过 – pinkfloydx33
@ Amey Kamat,@ pinkfloydx33,感谢您的评论。更改为(i + 1)后问题未解决。 – ledien