0

スレッドが実行されているときに GUI を更新するためのコールバックと、スレッドが終了したときに呼び出されるメソッドを持つ最もクリーンな方法を求めているだけです。

したがって、私の例では、Counterクラス (これがタスクです) と 2 つのデリゲート (コールバック用に 1 つ、スレッドの終了用に 1 つ) があります。

それはすべて正常に機能しますが、これは最善/最もクリーン/..な方法ではないと感じています。

ずっと前にプログラミングを始めていないので、デリゲートとスレッドスレッドの概念を理解するのに苦労しています。

カウンタークラス

class Counter
{
    private PrintCallback cb;
    private OnActionFinish oaf;

    public void SetCallback(PrintCallback c)
    {
        this.cb = c;
    }

    public void SetOnFinished(OnActionFinish f)
    {
        this.oaf = f;
    }

    public void Count()
    {
        for (int i = 0; i < 1000; i++)
        {
            cb(i);
        }
        oaf();
    }

}

そして私のメインフォーム

public delegate void PrintCallback(int i);
public delegate void OnActionFinish();

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
        PrintCallback cb = new PrintCallback(Print);
        OnActionFinish otf = new OnActionFinish(Finished);
        Counter c = new Counter();
        c.SetCallback(cb);
        c.SetOnFinished(otf);
        Thread t = new Thread(c.Count);
        t.Start();
        label1.Text = "Thread started";
    }

    private void Print(int i)
    {
        if (textBox1.InvokeRequired)
        {
            textBox1.Invoke((MethodInvoker)delegate { 
                textBox1.Text += i + "\r\n";
            });
        }
        else
        {
            textBox1.Text += i + "\n";
        }
    }

    private void Finished()
    {
        if (label1.InvokeRequired)
        {
            label1.Invoke((MethodInvoker)delegate { 
                label1.Text = "Thread finished";
                textBox1.SelectionStart = textBox1.Text.Length;
                textBox1.ScrollToCaret();
            });
        }
        else
        {
            label1.Text = "Thread finished";
        } 
    }
4

1 に答える 1