创建Task

1.new方式实例化一个Task,需要通过Start方法启动

  1. Task task = new Task(() =>
  2. {
  3. Thread.Sleep(100);
  4. Console.WriteLine($"hello, task1的线程ID为{Thread.CurrentThread.ManagedThreadId}");
  5. });
  6. task.Start();

2.Task.Factory.StartNew(Action action)创建和启动一个Task

  1. Task task2 = Task.Factory.StartNew(() =>
  2. {
  3. Thread.Sleep(100);
  4. Console.WriteLine($"hello, task2的线程ID为{ Thread.CurrentThread.ManagedThreadId}");
  5. });

3.Task.Run(Action action)将任务放在线程池队列,返回并启动一个Task

  1. Task task3 = Task.Run(() =>
  2. {
  3. Thread.Sleep(100);
  4. Console.WriteLine($"hello, task3的线程ID为{ Thread.CurrentThread.ManagedThreadId}");
  5. });

task.Status

TaskStatus 枚举
Task对象的状态,可以查看当前task对象是在什么状态

task.Wait

Task对象的Wait方法会阻塞主线程,不让主线程继续执行,等当前的task对象完成了才继续

Task.WaitAll

传入参数,task对象。等待这些task全部执行完成。

Task

如果Task任务有返回值,返回类型就是Task的繁星类型。用Task对象的Result取返回类型的值

  1. Task<string> task1 = new Task<string>(() =>
  2. {
  3. Thread.Sleep(1000);
  4. return "哈哈哈";
  5. });
  6. task1.Start();
  7. Console.WriteLine(task1.Result);

连续任务

如果一个任务的执行依赖于另一个任务,即任务的执行有先后顺序。此时,我们可以使用连续任务。
task.ContinueWith(ReadNews)表示一个任务task结束后,才开始执行另一个任务。

  1. static void Main(string[] args)
  2. {
  3. Task t1 = new Task(() =>
  4. {
  5. Thread.Sleep(1000);
  6. Console.WriteLine("哈哈哈");
  7. });
  8. Task t2 = t1.ContinueWith(A);
  9. Task t3 = t2.ContinueWith(B);
  10. t1.Start();
  11. Console.ReadKey();
  12. }
  13. static void A(Task odj)
  14. {
  15. Thread.Sleep(1000);
  16. Console.WriteLine("呵呵呵");
  17. }
  18. static void B(Task odj)
  19. {
  20. Thread.Sleep(1000);
  21. Console.WriteLine("嘿嘿嘿");
  22. }
  23. //打印结果
  24. //哈哈哈
  25. //呵呵呵
  26. //嘿嘿嘿