做了个小demo
using System;
using System.Threading;
using System.Windows.Forms;
namespace WindowsFormsApplication3
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private Random rdTime = new Random();
private delegate void ChangeTextBoxCallBack(TextBox control, string text);
private EventHandler LastRunThreadD;
private int m_threadOverCount = 0;
private void Form1_Load(object sender, EventArgs e)
{
Thread th = new Thread(ThreadA);
th.Start();
//winform其它操作..
}
private void ThreadA()
{
//A线程要做的事
//这里模拟做事耗时1s-10s之间
Thread.Sleep(rdTime.Next(1000, 10000));
ChangeTextBox(textBox1, "线程A处理完毕");
//按照题主要求,A线程处理完毕处理B、C
Thread tB = new Thread(ThreadB);
Thread tC = new Thread(ThreadC);
m_threadOverCount = 0;
LastRunThreadD += ThreadD;
tB.Start();
tC.Start();
}
private void ThreadB()
{
Thread.Sleep(rdTime.Next(1000, 10000));
m_threadOverCount++;
ChangeTextBox(textBox1, "线程B处理完毕");
//处理完毕运行线程D
if (LastRunThreadD != null)
LastRunThreadD.Invoke(null, null);
}
private void ThreadC()
{
Thread.Sleep(rdTime.Next(1000, 10000));
m_threadOverCount++;
ChangeTextBox(textBox1, "线程C处理完毕");
//处理完毕运行线程D
if (LastRunThreadD != null)
LastRunThreadD.Invoke(null, null);
}
private void ThreadD(object sender, EventArgs e)
{
//确定B、C线程都结束了才正式执行
if (m_threadOverCount == 2)
{
Thread.Sleep(rdTime.Next(1000, 10000));
ChangeTextBox(textBox1, "线程D处理完毕");
}
}
//这里使用Control而不是使用Textbox,是为了做通用委托,更改不同控件不同属性
//private void ChangeTextBox(Control control, params object[] value);
private void ChangeTextBox(TextBox control, string text)
{
if (control.InvokeRequired)
{
ChangeTextBoxCallBack ctbc = new ChangeTextBoxCallBack(ChangeTextBox);
control.Invoke(ctbc, control, text);
}
else
control.Text += string.IsNullOrEmpty(control.Text) ? text : "\r\n" + text;
}
}
}