开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 26573|回复: 4
收起左侧

[C#图文教程] CSharp多线程的N种姿势

[复制链接]
结帖率:64% (21/33)
发表于 2019-7-21 13:32:57 | 显示全部楼层 |阅读模式   菲律宾
1.Thread
  1.1基础的,Lambda与委托,写法灵活,这里不展开

  1. static void Main(string[] args)
  2. {
  3.     Thread thread = new Thread((() =>
  4.     {
  5.         Console.WriteLine("我被执行了!");
  6.     }));
  7.     thread.Start();
  8.     Console.ReadLine();
  9. }
复制代码

1.2使用函数
  1.    
  2. class Program
  3. {
  4.     static void Main(string[] args)
  5.     {
  6.         Thread thread = new Thread(Function);
  7.         thread.Start();
  8.         Console.ReadLine();
  9.     }

  10.     /// <summary>
  11.     /// 执行体
  12.     /// </summary>
  13.     static void Function()
  14.     {
  15.         Console.WriteLine("我被执行了");
  16.     }


  17.   
复制代码

1.3使用函数并且传递参数,执行函数的参数必须为object,才能匹配Thread的委托签名,使用起来不优雅,使用参数存在强制转换的问题

  1. class Program
  2. {
  3.     static void Main(string[] args)
  4.     {
  5.         Thread thread = new Thread(Function);
  6.         thread.Start("我是一个参数");
  7.         Console.ReadLine();
  8.     }

  9.     /// <summary>
  10.     /// 执行体
  11.     /// </summary>
  12.     static void Function(object args)
  13.     {
  14.         Console.WriteLine(args);
  15.     }
  16. }
复制代码

2.Task,这个内容就稍微有点多了

  1.     class Program
  2.     {
  3.         static void Main(string[] args)
  4.         {
  5.             //与Thread类似,直接new
  6.             Task task1 = new Task(Function);
  7.             task1.Start();

  8.             Task task2 = new Task(() =>
  9.              {
  10.                  Function("呵呵哒");
  11.              });
  12.             task2.Start();
  13.             //------------------------------------------------------------
  14.             //直接创建并启动
  15.             Task.Factory.StartNew(Function);
  16.             Task.Factory.StartNew(() =>
  17.             {
  18.                 Function("呵呵哒");
  19.             });
  20.             //------------------------------------------------------------
  21.             //利用泛型Task获取返回值
  22.             Task<int> task3 = Task.Factory.StartNew(GetResult);
  23.             task3 = Task.Run(GetResult);
  24.             task3 = Task.Run(() =>
  25.             {
  26.                 Console.WriteLine("做点别的啥的都可以...");
  27.                 return GetResult();
  28.             });
  29.             //只有具有返回值得Task对象才能获取Result属性,这个属性是阻塞的
  30.             //也就是说如果这个Task还没有执行完的话,调用这个属性会等待Task执行完成
  31.             var result = task3.Result;


  32.             //------------------------------------------------------------
  33.             //等待一组Task/线程执行完成
  34.             List<Task> tasks = new List<Task>(10);
  35.             for (int i = 0; i < 10; i++)
  36.             {
  37.                 var startNew = Task.Factory.StartNew(Function);
  38.                 tasks.Add(startNew);
  39.             }

  40.             //------------------------------------------------------------
  41.             //等待上面创建的10个Task全部完成,这个方法是阻塞的
  42.             Task.WaitAll(tasks.ToArray());

  43.             //------------------------------------------------------------
  44.             //等待上面创建的10个Task中的任意一个完成,这个方法也是阻塞的
  45.             Task.WaitAny(tasks.ToArray());

  46.             //延续任务,例如:游戏里学技能,某些技能具有前置技能,学了A才能学B.
  47.             //这里有两个任务,一个TaskA 一个TaskB
  48.             //一个TaskB必须要拿到TaskA的返回值才能开始计算,如下
  49.             Task<int> myTask = Task.Run(TaskA).ContinueWith(p =>
  50.              {
  51.                 //p.Result 就是TaskA这个方法的返回值
  52.                 return TaskB(p.Result);
  53.              });

  54.             //那么这里两个Task执行完成后 结果为1234567
  55.             Console.WriteLine(myTask.Result);



  56.             //------------------------------------------------------------
  57.             //获取/等待一组任务执行完成,并获取所有返回值
  58.             //比如:七龙珠集齐召唤神龙,一定要凑齐7颗才能继续
  59.             Task<int>[] taskArr =new Task<int>[7];
  60.             for (int i = 0; i < 7; i++)
  61.             {
  62.                 taskArr[i] = Task.Factory.StartNew(TaskA);
  63.             }
  64.             //获取7个任务的返回值
  65.             var resultAll = Task.WhenAll(taskArr).Result;

  66.             //获取/等待一组任务的任意一个执行完成,并获取返回值
  67.             //比如:大地鼠,谁先冒头,先打死谁(这个比喻有点不恰当)
  68.             var value = Task.WhenAny(taskArr).Result.Result;
  69.             
  70.         }

  71.         static int TaskA()
  72.         {
  73.             return 123456;
  74.         }

  75.         static int TaskB(int val)
  76.         {
  77.             return val + 1;
  78.         }

  79.         static void Function()
  80.         {

  81.         }
  82.         static void Function(object args)
  83.         {

  84.         }
  85.         static int GetResult()
  86.         {
  87.             return 10086;
  88.         }
  89.     }
复制代码
001.png
002.png
003.png
004.png
005.png
结帖率:43% (10/23)

签到天数: 5 天

发表于 2021-8-6 17:44:52 | 显示全部楼层   湖北省武汉市
不错 给你点赞
回复 支持 反对

使用道具 举报

结帖率:75% (3/4)

签到天数: 2 天

发表于 2021-8-6 16:59:41 | 显示全部楼层   云南省昆明市
一堆洋马,瞅瞅
回复 支持 反对

使用道具 举报

发表于 2020-3-27 10:48:55 | 显示全部楼层   山东省青岛市
backgroudwork?
回复 支持 反对

使用道具 举报

结帖率:100% (4/4)
发表于 2020-3-22 01:38:09 | 显示全部楼层   广西壮族自治区贺州市
大佬写的那么好 异步操作让我矛舍顿开,谢谢大佬
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报电话0663-3422125,QQ: 793400750,邮箱:wp@125.la
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

快速回复 返回顶部 返回列表