C# 执行某些SQL查询时显示progressbar
我想在程序执行某些SQL Server查询时显示进度条。我使用来自 代码如下:C# 执行某些SQL查询时显示progressbar,c#,.net,C#,.net,我想在程序执行某些SQL Server查询时显示进度条。我使用来自 代码如下: private Task ProcessData(List<Tuple<int,string>> list, IProgress<ProgressReport> progress) { int index = 1; int totalprogress = list.Count; var progressreport = new P
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);
}
private Task ProcessData(列表,IProgress进程)
{
int指数=1;
int totalprogress=list.Count;
var progressreport=新的progressreport();
返回任务。运行(()=>{
for(int i=0;i
{
progressBar1.Value=report.PercentComplete;
progressBar1.Update();
};
等待处理数据(列表、进度);
}
但是这个函数并不像我预期的那样工作。我的“列表”有13个项目,但它只执行大约7-8个项目。我必须多次单击“更新”按钮才能获得我需要的所有东西。我不知道如何强制程序等待函数“excuteAutoUpdate”(在本例中)完成,然后继续循环函数。我对n多线程编程非常陌生,所以有很多事情我不了解。我搜索一些东西,比如背景工作者,但我不能将其应用于我的案例
你能告诉我怎么解决吗
谢谢你 在每个循环中递增
i
两次
for(int i=0;i<totalprogress;i++) // HERE
{
...
progressreport.PercentComplete = i++ * 100 / totalprogress; // AND HERE
...
}
或者,您也可以将其更改为:
for(int i=0;i<totalprogress;) //remove i++
{
...
progressreport.PercentComplete = (++i) * 100 / totalprogress; // change to pre-increment
...
}
用于(int i=0;ii如果您完全按照您提到的视频进行操作,那么您的代码在第progressreport.PercentComplete=i++*100/totalprogress;
行上有一个错误。在视频中,它是index++,您编写了i++。您正在递增循环变量。仅供参考,您的百分比对于第一个元素将始终返回零,因为您使用i++*100
这将是0*100
,因为++
返回上一个值。您还可以增加两次(在这里和第三项循环中)将此行更改为(i+1)*100/totalprogress
或从循环本身删除i++
,并将该行更改为++i*100/totalprogress
您在循环中增加了两次,这就是为什么它似乎只运行其中一些,因为事实上,我得到了双倍的增量,并且跳过了一半@Amey Kamat,@pinkfloydx33,谢谢您的评论。问题出在哪里更改为(i+1)后无法解决。感谢您的回复,在我从i++更改为(i+1)后,问题仍然存在。函数“excuteAutoUpdate”需要7-8秒才能完成。
for(int i=0;i<totalprogress;) //remove i++
{
...
progressreport.PercentComplete = (++i) * 100 / totalprogress; // change to pre-increment
...
}