0

進捗レポートを取得しようとしている階層化されたワーカー クラスがあります。私が持っているものは次のようになります。

public class Form1
{
    private void Start_Click()
    {
        Controller controller = new Controller();

        controller.RunProcess();
    }
}

public class Controller
{
    public void RunProcess()
    {
        Thread newThread = new Thread(new ThreadStart(DoEverything));
        newThread.Start();
    }

    private void DoEverything()
    {
        // Commencing operation...
        Class1 class1 = new Class1();

        class1.DoStuff();

        Class2 class2 = new Class2();

        class2.DoMoreStuff();
    }

}

public class Class1
{
    public void DoStuff()
    {
        // Doing stuff
        Thread.Sleep(1000);

        // Want to report progress here
    }
}

public class Class2
{
    public void DoMoreStuff()
    {
        // Doing more stuff
        Thread.Sleep(2000);

        // Want to report progress here as well
    }
}

以前に BackgroundWorker クラスを使用したことがありますが、このようなものにはもう少し自由な形式が必要だと思います。デリゲート/イベント ソリューションを使用できると思いますが、ここで適用する方法がわかりません。クラス1とクラス2の進行状況で更新できるようにしたいフォーム1にいくつかのラベルまたは何かがあるとしましょう。それを行う最良の方法は何ですか?

4

3 に答える 3

1

ジョンは正しいです。イベントを利用したいので、デリゲートを使用する必要があります。これはあなたにいくつかのアイデアを与えるかもしれません。

http://www.yoda.arachsys.com/csharp/threads/winforms.shtml

于 2010-04-15T20:25:13.403 に答える
1

イベントを使用するのが最も簡単な解決策です。メイン スレッドからイベントをサブスクライブする場合、ハンドラーは をチェックして、メッセージを正しいスレッドに渡すためにControl.IsInvokeRequired自分自身を再度呼び出す必要があるかどうかを確認する必要があります。Invoke(...)

于 2010-04-15T20:16:38.603 に答える
0

通知中に処理スレッドをブロックしたくない場合はControl.BeginInvoke()、ファイア アンド フォーゲット動作を使用できます。

呼び出しの数を減らし、一定の間隔で進行状況を更新するには、さまざまな操作の状態をクラスにカプセル化することができます。
このようにして、おそらく別の集約状態クラスの揮発性フィールドなどに状態を書き込み、GUI スレッドでタイマーを使用して状態を再読み取りし、それに応じてラベルを更新することができます。

于 2010-04-15T20:51:14.023 に答える