2016-10-22 10 views
-1

私のプログラムが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"(この場合)関数を終了し、ループ機能を続行するかわからない。私はマルチスレッドプログラミングには非常に新しいので、理解していないことがたくさんあります。私はバックグラウンドワーカーのようなものを検索しますが、私の場合は適用できません。

解決方法を教えてください。

ありがとう!

+0

あなたが上記のビデオに正確に従っているなら、あなたのコードは 'progressreport.PercentComplete = i ++ * 100/totalprogress;'という行にエラーがあります。ビデオではインデックス++、あなたはi ++を書いています。ループ変数をインクリメントしています。 –

+0

FYIは、 '++ *'が前の値を返すので、 'i * * 100'を使用するので、最初の要素に対して常に0を返します。また、この行を '(i + 1)* 100/totalprogress'に変更するか、ループ自体から' i ++ 'を削除してその行を' ++ i * 100 /あなたがループ内で2回インクリメントしたという事実は、実際には私が二重に増分され、半分がスキップされるためです。 – pinkfloydx33

+0

@ Amey Kamat、@ pinkfloydx33、コメントありがとうございます。この問題は、(i + 1)に変更した後は解決されません。 – ledien

答えて

2

各ループでiを2回インクリメントしています。

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

変更と達成率を報告することに、注意してご使用コード:

0123:

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

関連する問題