|
1.Thread
1.1基础的,Lambda与委托,写法灵活,这里不展开
- static void Main(string[] args)
- {
- Thread thread = new Thread((() =>
- {
- Console.WriteLine("我被执行了!");
- }));
- thread.Start();
- Console.ReadLine();
- }
复制代码
1.2使用函数
-
- class Program
- {
- static void Main(string[] args)
- {
- Thread thread = new Thread(Function);
- thread.Start();
- Console.ReadLine();
- }
- /// <summary>
- /// 执行体
- /// </summary>
- static void Function()
- {
- Console.WriteLine("我被执行了");
- }
-
复制代码
1.3使用函数并且传递参数,执行函数的参数必须为object,才能匹配Thread的委托签名,使用起来不优雅,使用参数存在强制转换的问题
- class Program
- {
- static void Main(string[] args)
- {
- Thread thread = new Thread(Function);
- thread.Start("我是一个参数");
- Console.ReadLine();
- }
- /// <summary>
- /// 执行体
- /// </summary>
- static void Function(object args)
- {
- Console.WriteLine(args);
- }
- }
复制代码
2.Task,这个内容就稍微有点多了
- class Program
- {
- static void Main(string[] args)
- {
- //与Thread类似,直接new
- Task task1 = new Task(Function);
- task1.Start();
- Task task2 = new Task(() =>
- {
- Function("呵呵哒");
- });
- task2.Start();
- //------------------------------------------------------------
- //直接创建并启动
- Task.Factory.StartNew(Function);
- Task.Factory.StartNew(() =>
- {
- Function("呵呵哒");
- });
- //------------------------------------------------------------
- //利用泛型Task获取返回值
- Task<int> task3 = Task.Factory.StartNew(GetResult);
- task3 = Task.Run(GetResult);
- task3 = Task.Run(() =>
- {
- Console.WriteLine("做点别的啥的都可以...");
- return GetResult();
- });
- //只有具有返回值得Task对象才能获取Result属性,这个属性是阻塞的
- //也就是说如果这个Task还没有执行完的话,调用这个属性会等待Task执行完成
- var result = task3.Result;
- //------------------------------------------------------------
- //等待一组Task/线程执行完成
- List<Task> tasks = new List<Task>(10);
- for (int i = 0; i < 10; i++)
- {
- var startNew = Task.Factory.StartNew(Function);
- tasks.Add(startNew);
- }
- //------------------------------------------------------------
- //等待上面创建的10个Task全部完成,这个方法是阻塞的
- Task.WaitAll(tasks.ToArray());
- //------------------------------------------------------------
- //等待上面创建的10个Task中的任意一个完成,这个方法也是阻塞的
- Task.WaitAny(tasks.ToArray());
- //延续任务,例如:游戏里学技能,某些技能具有前置技能,学了A才能学B.
- //这里有两个任务,一个TaskA 一个TaskB
- //一个TaskB必须要拿到TaskA的返回值才能开始计算,如下
- Task<int> myTask = Task.Run(TaskA).ContinueWith(p =>
- {
- //p.Result 就是TaskA这个方法的返回值
- return TaskB(p.Result);
- });
- //那么这里两个Task执行完成后 结果为1234567
- Console.WriteLine(myTask.Result);
- //------------------------------------------------------------
- //获取/等待一组任务执行完成,并获取所有返回值
- //比如:七龙珠集齐召唤神龙,一定要凑齐7颗才能继续
- Task<int>[] taskArr =new Task<int>[7];
- for (int i = 0; i < 7; i++)
- {
- taskArr[i] = Task.Factory.StartNew(TaskA);
- }
- //获取7个任务的返回值
- var resultAll = Task.WhenAll(taskArr).Result;
- //获取/等待一组任务的任意一个执行完成,并获取返回值
- //比如:大地鼠,谁先冒头,先打死谁(这个比喻有点不恰当)
- var value = Task.WhenAny(taskArr).Result.Result;
-
- }
- static int TaskA()
- {
- return 123456;
- }
- static int TaskB(int val)
- {
- return val + 1;
- }
- static void Function()
- {
- }
- static void Function(object args)
- {
- }
- static int GetResult()
- {
- return 10086;
- }
- }
复制代码 |
|