C#异步编程的实现方式(5)——连续任务
2013-03-12 16:50
489 查看
通过任务,可以指定在任务完成后,应开始运行另一个特定任务。任务处理程序或者不带参数或者带一个对象参数,而连续处理程序有一个Task类型的参数。下面先定义两个任务:
[/code]
[/code]
连续任务通过在任务上调用ContinueWith()方法来现实:
[/code]
[/code]
主线程循环输出字符串到控制台,Task1任务在另外一个线程里运行,FirstTaskMethod执行完继续SecondTaskMethod,结果如图:
值得注意的是,在一个任务结束时,可以启动多个任务,也就是说,任务的连接可以像一个树结构那样,如下代码:
[/code]
[/code]
无论前一个任务是如何结束的,后面的连续任务总是在前一个任务结束时启动。TaskContinuationOptions枚举提供了OnlyOnFaulted,NotOnFaulted,OnlyOnCanceled,NotOnCanceled,OnlyOnRunToCompletion几个选项。我们可以指定只有当前一个任务成功结束时才启动:
[/code]
[/code]
参考资料:http://social.microsoft.com/Forums/zh-CN/visualcshartzhchs/thread/d72a956f-b44b-4017-aa98-f60d28c123c9
http://www.cnblogs.com/sosowjb/archive/2012/08/12/2634163.html
[code] [code] static void FirstTaskMethod()
{
Console.WriteLine(String.Format("Task{0} is doing something", Task.CurrentId));
Thread.Sleep(200);
}
static void SecondTaskMethod(Task task)
{
Console.WriteLine("Last task is finished");
Console.WriteLine(String.Format("Task{0} is doing something", Task.CurrentId));
Thread.Sleep(200);
}
[/code]
[/code]
连续任务通过在任务上调用ContinueWith()方法来现实:
[code] [code] static void Main(string[] args)
{
Task task1 = new Task(FirstTaskMethod);
Task task2 = task1.ContinueWith(SecondTaskMethod);
task1.Start();
for (int i = 0; i < 20; i++)
{
Console.WriteLine("Main thread is running");
Thread.Sleep(200);
}
Console.Read();
}
[/code]
[/code]
主线程循环输出字符串到控制台,Task1任务在另外一个线程里运行,FirstTaskMethod执行完继续SecondTaskMethod,结果如图:
值得注意的是,在一个任务结束时,可以启动多个任务,也就是说,任务的连接可以像一个树结构那样,如下代码:
[code] [code] Task task1 = new Task(FirstTaskMethod);
Task task2 = task1.ContinueWith(SecondTaskMethod);
Task task3 = task1.ContinueWith(SecondTaskMethod);
Task task4 = task2.ContinueWith(SecondTaskMethod);
Task task5 = task2.ContinueWith(SecondTaskMethod);
[/code]
[/code]
无论前一个任务是如何结束的,后面的连续任务总是在前一个任务结束时启动。TaskContinuationOptions枚举提供了OnlyOnFaulted,NotOnFaulted,OnlyOnCanceled,NotOnCanceled,OnlyOnRunToCompletion几个选项。我们可以指定只有当前一个任务成功结束时才启动:
[code] [code] Task task5 = task2.ContinueWith(SecondTaskMethod, TaskContinuationOptions.OnlyOnRanToCompletion);
[/code]
[/code]
参考资料:http://social.microsoft.com/Forums/zh-CN/visualcshartzhchs/thread/d72a956f-b44b-4017-aa98-f60d28c123c9
http://www.cnblogs.com/sosowjb/archive/2012/08/12/2634163.html
相关文章推荐
- C#异步编程的实现方式(5)——连续任务
- C#异步编程的实现方式(4)——Task任务
- C#异步编程的实现方式(6)——层次任务
- C#异步编程的实现方式——Task任务
- C#异步编程的实现方式(4)——Task任务
- C#异步编程的实现方式(4)——Task任务
- C#异步编程的实现方式(6)——层次任务
- C#异步编程的实现方式(4)——Task任务
- activiti 工作流 动态 设置 指定 节点任务人、责任人、组 的实现方式
- 多种方式实现Android定时任务
- Spring定时任务的实现方式--Quartz
- Spring定时任务的几种实现方式
- C#异步编程的实现方式(1)——异步委托
- PHP实现定时任务(非linux-shell方式,与操作系统无关)
- 《第九周任务一》定义Complex类中的《《和》》运算符的重载,实现输入和输出,改造原程序中对运算结果显示方式,使程序读起来更自然
- 第九周实验报告任务3 定义分数类中<<和>>运算符重载,实现分数的输入输出,改造原程序中对运算结果显示方式,使程序读起来更自然。
- Python定时任务的实现方式
- javaWeb定时任务的一种实现方式
- 单片机多任务的时间片方式实现 .
- Spring定时任务的实现方式--ScheduledExecutorService