スレッドが実行されているときに 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";
}
}