0

実際にスレッドの実際の進行状況を反映する、wpf で進行状況バーを実装する方法について、太陽の下でリソースを読みました。
注 - **企業の決定により、私は .NET 4 のみに縛られているため、残念ながら新しい技術は自由に使用できません。
これは私がこれまでに試したことです。
私が実行する方法はLoadTable(). 直接実行すると、完了するまでに約 5 秒かかります。で実行すると、BackgroundWorker約 15 秒かかります (直接呼び出すよりも 3 倍長くなります)。

private void bw_DoWork(object sender, DoWorkEventArgs e)
        {

            BackgroundWorker bg = (BackgroundWorker)sender;
            for (int i = 0; i <= 100; i++)
            {
                // a method that takes time to exceute.
                LoadTable();
                bg.ReportProgress(i);
            }
        }

また、独自のスレッドでメソッドを実行しようとしましたが、BackgroundWorker次のように別のスレッドの進行状況バーに報告されます。

 private void LoadTable_2()
      {
          task = Task.Factory.StartNew(new Action(() => LoadTable()));
      }


private void bw_DoWork(object sender, DoWorkEventArgs e)
        {
            LoadTable_2();
            BackgroundWorker bg = (BackgroundWorker)sender;
            for (int i = 0; i <= 100; i++)
            {
                Thread.Sleep(i);
                bg.ReportProgress(i);
            }
        }

しかし、この場合、2 つのスレッド間に接続がなく、プログレス バーが 99 まで実行されないようにする方法がなく、LoadTableメソッドを実行する他のスレッドが終了するまでそこで待機します。メソッドの実行の実際の進行状況は報告されません。私の質問は、実行を遅くすることなく実際に進行状況を報告するに
はどうすればよいですか? BackgroundWorkerありがとう!

4

1 に答える 1

1

LoadTable()ループで 100 回 (!)呼び出すと遅くなるのも不思議ではありません。一度だけ呼び出す必要があります。

ただしLoadTable()、API は進捗状況の報告をサポートしていないようです。現在の進行状況を返さないメソッドの進行状況を報告する方法はありません。

中間進行状況バー ( に設定) を表示することを検討する必要がありIsIndeterminateますtrueLoadTable()報告しないと現在の進捗状況がわからないのでこれが精一杯です。

于 2019-12-10T13:38:56.473 に答える