Task三个列子的分享
这次要分享的是C#Task任务的几个列子,感觉最实用的是封装的分页任务执行方法,这个方法步奏也是目前在我工作中执行多任务常用的,不知道各位也有这用的情况,那么开始吧。
1.顺序任务执行
1 //顺序任务执行 2 Task.Factory.StartNew<int>(() => { Console.WriteLine(1); return 1; }). 3 //等待5s以后才会依次输出2,3 4 ContinueWith((task) => 5 { 6 7 Stopwatch wt = new Stopwatch(); 8 wt.Start(); 9 Thread.Sleep(1000 * 5); 10 wt.Stop(); 11 Console.WriteLine("等待了:{0}ms,输出结果{1}", wt.ElapsedMilliseconds, 2); 12 }). 13 ContinueWith((task) => { Console.WriteLine(3); }). 14 Wait();
上面的代码中也备注了一些文字说明,其中有关键词语及意思如下:
.Task.Factory.StartNew:创建一个Task实例,创建后自动开启,无需在调用Start;
.ContinueWith:看单词的意思就明了,是继续的意思,在这里的效果也是等待上一个Task执行完毕了在继续执行本次任务,这里方法里面每个任务是一层一层传递的
效果图:
这里有个地方注意,sleep这是了5s但是这里使用Stopwatch统计出来只有4999ms,这个地方存在差异性,本章不解释,有兴趣朋友可以分享下或研究下。
2.并行任务效果
1 //并行任务 2 var watch = new Stopwatch(); 3 //func方法(认知特点:任意长度参数,最后一个的类型是方法返回的返回值类型) 4 Func<object, int> fun = (num) => 5 { 6 Thread.Sleep(1000 * 2); 7 Console.WriteLine("第{0}个", num); 8 return Convert.ToInt32(num); 9 }; 10 var len = 5; 11 var tasks = new Task<int>[len]; 12 //开始计算处理时间 13 watch.Start(); 14 for (int _i = 0; _i < len; _i++) 15 { 16 //Task.Factory.StartNew直接开启Task任务无需在使用start 17 tasks[_i] = Task.Factory.StartNew<int>(fun, _i); 18 } 19 //10s等待 20 Task.WaitAll(tasks, 1000 * 10); 21 watch.Stop(); 22 Console.WriteLine("tasks共使用时间:{0}s={1}ms", watch.ElapsedMilliseconds / 1000, watch.ElapsedMilliseconds);