2016-10-22 172 views
-1

我想在我的程序执行某些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多线程编程很陌生,所以有很多我不明白的东西。我搜索一些像背景工作者的东西,但我不能将它应用于我的案例。

你能告诉我如何解决它吗?

谢谢你!

+0

如果您确切地遵循了您提到的视频,那么您的代码在'progressreport.PercentComplete = i ++ * 100/totalprogress;'行上有错误。在视频中,它是索引++,你已经写了i ++。您正在增加循环变量。 –

+0

仅供参考您的百分比总是会为第一个元素返回零,因为您使用'+++ 100',这将是'0 * 100',因为++ ++返回之前的值。你也增加了两次(这里和第三学期的循环中)把这行改为'(i + 1)* 100/totalprogress'或者从循环中删除'i ++',并把那行改为'++ i * 100/totalprogress'你在循环中增加两次的原因是为什么它只能运行其中的一部分,因为事实上我会加倍增加,一半跳过 – pinkfloydx33

+0

@ Amey Kamat,@ pinkfloydx33,感谢您的评论。更改为(i + 1)后问题未解决。 – ledien

回答

2

您在每个循环中递增两次i

for(int i=0;i<totalprogress;i++) // HERE 
{ 
    ... 
    progressreport.PercentComplete = i++ * 100/totalprogress; // AND HERE 
    ... 
} 

所以,你实际上只处理(最好)一半的结果。这就是为什么你必须不断运行它来处理所有事情。

还要注意,由于后增量(i++)增量前返回i的价值,你的第一个循环将报告完成百分比为0

i++*100/totalprogress =>0*100/totalprogress =>0

更改您的代码:

for(int i=0;i<totalprogress;i++) 
{ 
    ... 
    progressreport.PercentComplete = (i+1) * 100/totalprogress; // This line 
    ... 
} 

或者,你也可以将其更改为:

for(int i=0;i<totalprogress;) //remove i++ 
{ 
    ... 
    progressreport.PercentComplete = (++i) * 100/totalprogress; // change to pre-increment 
    ... 
} 
+0

感谢您的回复,在我从i ++更改为(i + 1)后,问题仍然存在。功能“excuteAutoUpdate”需要7-8秒完成。 – ledien