案例:点击事件触发后顺序执行GetA、GetB、GetC三个方法,GetB必须在GetA执行完成后才能执行。
GetA执行要5s、GetB执行要2s、GetC执行要5s,顺序执行完这三个方法需要执行12s。
顺序执行效果
线程等待执行效果:
现以线程等待方式实现方法调用,代码如下:
private void button1_Click(object sender, EventArgs e)
{
try
{
listBox1.Items.Clear();
long nn = DateTime.Now.Ticks;
TaskFactory factory = new TaskFactory();
Task task3 = factory.StartNew(() => { GetC(); });
Task task1 = factory.StartNew(() => { GetA(); });
//task1.Wait()会导致程序假死
//当GetA方法执行完后才执行GetB
Task task2 = factory.ContinueWhenAll(new Task[] { task1 }, ((preTasks) =>
{
GetB();
DateTime dateTime = new DateTime(DateTime.Now.Ticks - nn);
MessageBox.Show(dateTime.ToString("HH:mm:ss.fff"));
}));
}
catch (Exception ex)
{
throw ex;
}
}
private void GetA()
{
Thread.Sleep(5000);
if (listBox1.InvokeRequired)
{
this.Invoke(new Action(() =>
{
listBox1.Items.Add("线程调用GetA");
}));
}
else
{
listBox1.Items.Add("同步调用GetA");
}
}
private void GetB()
{
Thread.Sleep(2000);
if (listBox1.InvokeRequired)
{
this.Invoke(new Action(() =>
{
listBox1.Items.Add("线程调用GetB");
}));
}
else
{
listBox1.Items.Add("同步调用GetB");
}
}
private void GetC()
{
Thread.Sleep(5000);
if (listBox1.InvokeRequired)
{
this.Invoke(new Action(() =>
{
listBox1.Items.Add("线程调用GetC");
}));
}
else
{
listBox1.Items.Add("同步调用GetC");
}
}