Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/278.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 执行某些SQL查询时显示progressbar_C#_.net - Fatal编程技术网

C# 执行某些SQL查询时显示progressbar

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

我想在程序执行某些SQL Server查询时显示进度条。我使用来自

代码如下:

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