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); }

浙公网安备 33010602011771号