任务(Task类)

在.NET4 新的命名空间System.Threading.Tasks包含了类抽象出了线程功能,在后台使用的ThreadPool进行管理的。任务表示应完成某个单元的工作。这个工作可以在单独的线程中运行,也可以以同步方式启动一个任务。

任务也是异步编程中的一种实现方式。

创建Task的方式:

static void ThreadMethod2() {
    Console.WriteLine ("线程开始");
    Console.WriteLine (Thread.CurrentThread.ManagedThreadId);
    Thread.Sleep(2000);
    Console.WriteLine("线程结束");
}

public static void Main (string[] args)
{
    //方式1
    Task t = new Task (ThreadMethod2);
    t.Start ();
    Console.WriteLine ("Main");
    Console.ReadKey ();    

    //方式2
    TaskFactory tf = new TaskFactory ();
    tf.StartNew(ThreadMethod2);    
    Console.WriteLine ("Main");
    Console.ReadKey ();
}

连续任务

如果一个任务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);

任务层次结构

我们在一个任务中启动一个新的任务,相当于新的任务是当前任务的子任务,两个任务异步执行,如果父任务执行完了但是子任务没有执行完,它的状态会设置为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 ");
}

results matching ""

    No results matching ""