任务的其他知识
连续任务
如果一个任务t1的执行是依赖于另一个任务t2的,那么就需要这个任务t2执行完毕后再开始执行t1.这个时候需要使用连续任务。
static void DoFirst()
{
Console.WriteLine("do in task : "+Task.CurrentId);
Thread.Sleep(3000);
}
static void DoSecond(Task t)
{
Console.WriteLine("task "+t.Id+" finished.");
Console.WriteLine("this task id is "+Task.CurrentId);
Thread.Sleep(3000);
}
Task t1 = new Task(DoFirst);
Task t2 = t1.ContinueWith(DoSecond);
Task t3 = t1.ContinueWith(DoSecond);
Task t4 = t2.ContinueWith(DoSecond);
Task t5 = t1.ContinueWith(DoError,TaskContinuationOptions.OnlyOnFaulted);
//t2和t3的执行依赖于t1
//t2和t3是异步执行的
//t4的执行依赖于t2
任务的层次结构
当我们在一个任务中启动一个新的任务,相当于新的任务是当前任务的一个子任务,两个任务是异步执行的;
如果父任务执行完了但是子任务没有执行完,它的状态会设置为WaitingForChildrenToComplete,只有当子任务也执行完毕了,父任务的状态才会变成RunToCompletion
static void Main()
{
var parent = new Task(ParentTask);
parent.Start();
Thread.Sleep(2000);
Console.WriteLine(parent.Status);
Thread.Sleep(4000);
Console.WriteLine(parent.Status);
Console.ReadKey();
}
static void ParentTask(){
Console.WriteLine("task id "+Task.CurrentId);
var child = new Task(ChildTask);
child.Start();
Thread.Sleep(1000);
Console.WriteLine("parent started child , parent end");
}
static void ChildTask(){
Console.WriteLine("child");
Thread.Sleep(5000);
Console.WriteLine("child finished ");