6

Visual Studio 2010でGUIを作成しているc#(ソースがあります)で記述されたコマンドラインツールがあります。GUIで、ツール操作の進行状況を反映するように進行状況バーを更新します。ツールの内部から、進行状況が確認されたことを通知し、進行状況バーを更新するにはどうすればよいですか?私がしていることのいくつかの簡略化されたサンプルコード。

private void doThings_Click(object sender, EventArgs e)
{
  myToolInstance.doWorkThatNeedsToReportProgress();
}

ツールによって実行されている作業は、一連の関数呼び出しであり、通常は約30です。これらのいずれかが終了するたびに、進行状況バーを更新したいと思います。

4

2 に答える 2

16

プログレスバーを含むフォームにパブリックプロパティまたはパブリックメソッドを作成します

public void SetProgress(int progress)
{
    progressBar.Progress = progress;
}

これで、プログレスバーを次のように更新できます

myForm.SetProgress(50);

もう1つのアプローチは、ProgressChangedどこかにイベントを設定し、フォームにこのイベントをサブスクライブさせることです。

public class Tool {
    public event Action<int> ProgressChanged;

    private void OnProgressChanged(int progress) 
    {
        var eh = ProgressChanged;
        if (eh != null) {
            eh(progress);
        }
    }

    public void DoSomething()
    {
        ...
        OnProgressChanged(30);
        ...
    }
}

この形であなたはこのようなものを持っているでしょう

private Tool _tool;

public MyForm () // Constructor of your form
{
    _tool = new Tool();
    _tool.ProgressChanged += Tool_ProgressChanged;
}

private void Tool_ProgressChanged(int progress)
{
    progressBar.Progress = progress;
}
于 2012-06-28T20:16:59.470 に答える
0

ゴールデンショベル候補ですが、それでも同様の問題に遭遇したので、ここで解決策を共有したいと思います。

一般に、計算が複雑なため、非同期で実行されるメソッドがあります。入力パラメータの1つは、プログレスバー自体です。
はnull許容型であるためProgressBar、メソッドを呼び出すときに必須ではありません。
メソッド内で、ディスパッチャでプログレスバーを進めます。多くの場合、メソッドはプログレスバーを所有する他のスレッドで実行されます。プログレスバーのnullの可能性を処理するために、nullable演算子を使用します。

private string MyMethod(int input, ProgressBar progressBar)
{
    while(!done)
    {
        // Do the hard work.

        progressBar?.Dispatcher.Invoke(() => progressBar.Value++);
    }
}

ここで、メソッドを呼び出す前にプログレスバーを設定するMaxiumim必要があり、予想される長さに設定する必要があります。

プログレスバーを進める必要があるたびに、ディスパッチャに電話をかけるのが非常に非効率になっていると言う人もいるかもしれません。はい、私はそれに同意します、しかしそれはすべて私たちが通過する必要があるステップの数に依存します。そのため、簡単なベンチマークを実行しました。

私の場合、300,000(30万)を超えるステップがありました(各ステップは、データを文字列にフォーマットし、その文字列をファイルに書き込むことでした)。プログレスバーを更新せずにメソッドを実行することが私の参考になりました。

  • ステップでプログレスバーを更新すると、実行時間が2,000%以上長くなりました(20倍長くなりました)
  • 10ステップごとにプログレスバーを更新すると、実行時間が250%以上長くなりました(2.5倍長くなりました)
  • プログレスバーを100ステップごとに更新すると、実行時間が約15%長くなりました(約1/8長くなります) 。
  • 1000ステップごとにプログレスバーを更新すると、実行時間が約3%長くなりました(わずかな違い)

プログレスバーの幅が240ピクセルの場合、プログレスバーの最大値は約300になり、それに応じて更新すると、パフォーマンスが著しく低下することなく、非常にスムーズなアニメーションが得られます。

于 2019-10-09T10:58:50.043 に答える