• 多线程2——Task


    1.创建和启动Task任务

     Task task1 = new Task(() => { Console.WriteLine("通过Start启动Task任务"); });
        task1.Start();
    
        Task.Run(() => { Console.WriteLine("通过Run启动Task任务"); });
    
        TaskFactory taskFactory = new TaskFactory();
        taskFactory.StartNew(() => { Console.WriteLine("通过工厂代理启动任务"); });

    2.多个任务

     List<Task> tasks = new List<Task>();
        for (int i = 0; i < 100; i++)
        {
            int j = i;
            tasks.Add(Task.Run(() =>
            {
                Thread.Sleep(1000);
                Console.WriteLine($"{j}");
            }));
        }
        Task.WaitAny(tasks.ToArray());
        Console.WriteLine("只用等待一个");
        Task.WaitAll(tasks.ToArray());
        Console.WriteLine("等待全部完成");

    3.多任务不卡界面等待

     TaskFactory taskFactory2 = new TaskFactory();
        List<Task> tasks2 = new List<Task>();
        for (int i = 0; i < 100; i++)
        {
            int j = i;
            tasks2.Add(taskFactory2.StartNew(() =>
            {
                Thread.Sleep(1000);
                Console.WriteLine($"{j}");
            },TaskCreationOptions.LongRunning));
        }
        taskFactory2.ContinueWhenAll(tasks2.ToArray(), (ss) => { Console.WriteLine($"最后{ss.Length}"); });

    4. TaskCreationOptions类

     ①.AttachedToParent:指定将任务附加到任务层次结构中的某个父级,父任务必须等待所有子任务执行完毕才能执行   
    
      ②. DenyChildAttach: 不允许子任务附加到父任务上
    
      ③. HideScheduler: 子任务不使用父类Task的Scheduler,而是使用默认的 
    
      ④. LongRunning:当已知是长时间运行的任务,可以使用该选项
    
      ⑤. PreferFairness:类似于队列的感觉,尽可能公平的方式安排任务 

    5.多任务控制线程数量

     TaskFactory taskFactory3 = new TaskFactory();
        List<Task> tasks3 = new List<Task>();
        for (int i = 0; i < 100; i++)
        {
            int j = i;
            if (tasks3.Where(s => s.Status != TaskStatus.RanToCompletion).ToList().Count > 9)
            {
                Thread.Sleep(500);
                Task.WaitAny(tasks3.ToArray());
                tasks3 = tasks3.Where(s => s.Status != TaskStatus.RanToCompletion).ToList();
            }
            tasks3.Add(taskFactory3.StartNew(() => { Console.WriteLine($"{tasks3.Count}"); }));
        }
  • 相关阅读:
    跳跃游戏1,2
    重叠子区间问题
    最长公共子序列问题
    由leetcode俄罗斯套娃信封问题到C++的sort()函数学习
    一道笔试题,做的很垃圾
    Spring boot框架快速入门
    Redis常用数据类型及其对应的底层数据结构
    Java 类加载机制及双亲委派模型
    Java面试高频知识点总结 part3
    Spring框架专题
  • 原文地址:https://www.cnblogs.com/yyl001/p/16278901.html
Copyright © 2020-2023  润新知