C# 线程、任务和同步(2)

 任务

任务表示应完成的某个单元的工作。这个单元的工作可以在单独的线程中运行,也可以以同步方式启动一个任务,这需要等待主调线程。使用任务不仅可以获得一个抽象层,还可以对底层线程进行很多控制。

在安排需要完成的工作时,任务提供了非常大的灵活性。 例如,可以定义连续的工作——在一个任务完成后该执行什么工作。这可以区分任务成功与否。另外,还可以在层次结构中安排任务。例如,父任务可以创建新的子任务。这可以创建一种依赖关系,这样,取消父任务,也会取消其子任务。

启动任务

要启动任务,可以使用TaskFactory类或Task类的构造函数和start()方法。

在启动任务时,会创建Task类的一个实例,利用Action或Action<object>委托(不带参数或带一个参数),可以指定应运行的代码。这类似于Thread类 。

    using cs = Console;
    class Program
    {
        static void Main()
        {
            //1
            TaskFactory tf = new TaskFactory();
            Task t1 = tf.StartNew(JobForATask);

            //2
            Task t2 = Task.Factory.StartNew(JobForATask);

            //3
            Task t3 = new Task(JobForATask);
            t3.Start();
            
            Thread.Sleep(500);
        }

        static void JobForATask()
        {
            cs.WriteLine("JobForATask. task id : {0}", Task.CurrentId);
        }
    }

在上面的代码中,可以看到启动新任务的不同方式。第一种方式使用实例化的TaskFactory类,在其中把TaskMethod()方法传递给StartNew()方法,就会立即启动任务。第二种方式使用 Task类的构造函数,同样立即运行。第三种方式,实例化Task对象时,任务不会立即运行,而是指定Created状态。接着调用Task类的Start()方法,来启动任务。使用Task类时,除了调用Start()方法,还可以调用RunSynchronously()方法。这样,任务也会启动,但在调用者的当前线程中它正在运行,调用者需要一直等待到该任务结束。默认情况下,任务是异步运行的。

 带参数的:

Task t3 = new Task(JobForATask, "Main");
        static void JobForATask(object str)
        {
            string caller = (string)str;
            cs.WriteLine(caller + " JobForATask. task id : {0}", Task.CurrentId);
        }

 

 

 

posted @ 2018-01-24 09:53  吴筱军  阅读(113)  评论(0)    收藏  举报