0

基本的に、クラスがあり、その中にテキスト ファイル内のすべての行をカウントする関数があります。

カウントする各行で Form1 の進行状況バーを更新する必要があります。私が試してみました:

public static void rfile(string f)
{
    string[] lines = File.ReadAllLines(f);
    Form1 form = new Form1();
    foreach (string l in lines)
    {
        form.increaseProg();
    }
}

Form.cs

public void increaseProg()
{
    progressBar.Value++;
    System.Threading.Thread.Sleep(1000);
    progressBar.Refresh();
}

しかし、それは進行状況バーをまったく増加させないようです。

4

3 に答える 3

1

このクラスを利用して、Progress関係者全員が長時間実行される操作中に UI を簡単に更新できるようにすることができます。Progressフォーム内にクラスを作成し、進行状況が与えられたときに UI を更新する方法を示します。次に、そのオブジェクトを、長時間実行される作業を行う他のクラスに渡します。

private void button1_Click(object sender, EventArgs args)
{
    Progress<int> progress = new Progress<int>();
    progress.ProgressChanged += (p, value) => progressbar1.Value = value;
    Task.Run(() => SomeOtherClass.DoWork("c:/temp.txt", progress));
}

もちろん、長時間実行される作業は、UI のブロックを回避するために別のスレッドで行われます。UI スレッドへのイベントのProgressマーシャリングはクラスが処理ProgressChangedしてくれるので、考える必要はありません。

ワーカーについては、必要に応じて進行状況を報告する必要があります。

public class SomeOtherClass
{
    public static void DoWork(string filepath, IProgress<int> progress)
    {
        int currentProgress = 0;
        foreach (var line in File.ReadLines(filepath))
        {
            DoSomethingWithLine();
            currentProgress++;
            progress.Report(currentProgress);
        }
    }
}

このアプローチのもう 1 つの利点はSomeOtherClass、フォームについて何も知る必要がないことに注意してください。オブジェクトを提供できる人なら誰でも呼び出すことができIProgressます。そのメソッドを呼び出す必要がある他のフォームがある場合は、まったく変更する必要はありません。また、ある開発者がフォームを作成し、別の開発者が長時間実行されるプロセスをコーディングしている場合、DoWorkメソッドの署名に同意するだけで済みます。それ以降は、UI 担当者がすべての UI 作業を行い、非 UI 担当者がすべての非 UI 作業を行うことができ、他の人が何をしているかを心配する必要はありません。

コードが機能しない理由については、ワーカー メソッドが表示されているフォームのインスタンスにアクセスしていないことです。新しいフォームを作成し、プログレス バーを変更して、誰にも表示されません。 、そしてそれを捨てる。

于 2013-11-04T15:20:18.350 に答える
0

これは、行を読んでいて、プログレスバーを更新するときに、想像どおりに UI が完全に更新されないためです。場合によっては機能する可能性があるため、progressBar.Refresh() (プログレスバーに更新機能があるかどうか思い出せません) を実行して、フォームのビジュアル (特にプログレスバー) を更新できるようにする必要があります。線を通り抜けます。基本的に、「速すぎる」ため、更新が遅れる可能性があります。

進行状況バーが更新されていますが、更新が行われていないだけです。1 つの方法はおそらくマルチスレッド化することですが、これは行の読み取りと UI の更新にはやり過ぎです。

これだけでなく、コードは基本的にUIを表示しません...更新中であり、UIを表示していないため、フォームをShow()して更新を実行する必要があります。フォームをインスタンス化しますが、実際には表示しません。

于 2013-11-04T13:32:48.127 に答える