清泛IT社区App Inventor 2 中文社区

搜索

扫码访问移动社区 移动社区,您的掌上技术专家

关注我,精彩不错过! 关注我,精彩不错过!

扫码安装最新版AI伴侣 最新版AI伴侣v2.72

Aia Store .aia 源码一站式解决方案 发布日志AI2连接测试ai2Starter模拟器

开通会员送SVIPApp Inventor 2 拓展有奖征文 VIP会员享专有教程,免费赠送基础版*技术支持服务! AI2入门必读中文文档中文教程IoT专题

查看: 1055|回复: 0
打印 上一主题 下一主题

C# 多线程、并行处理全攻略(持续更新)

  • TA的每日心情
    开心
    2024-02-17 18:16
  • 签到天数: 14 天

    [LV.3]偶尔看看II

    546

    主题

    715

    帖子

    1万

    积分

    管理员

    这里没有广告...

    Rank: 9Rank: 9Rank: 9

    积分
    10709
    QQ
    跳转到指定楼层
    楼主
    发表于 2015-10-23 11:11:33 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
    一、多线程(Thread):
    1. using System.Threading;
    2. ...

    3. Thread t = new Thread(new ThreadStart(delegate
    4. {
    5.         Proxy(delegate
    6.         {
    7.                 button3.Enabled = false;
    8.         });

    9.         ...
    10. }));
    11. t.IsBackground = true;
    12. t.Start();
    复制代码
    1. #region 多线程委托

    2. public delegate void ProxyInvoker();

    3. // 主线程直接执行,后台线程委托主线程执行
    4. private void Proxy(ProxyInvoker invoke)
    5. {
    6.         if (invoke == null)
    7.                 return;

    8.         if (this.InvokeRequired)
    9.         {
    10.                 this.Invoke(invoke);
    11.                 return;
    12.         }

    13.         invoke();
    14. }

    15. #endregion
    复制代码
    那么为什么需要委托主线程执行呢?由于我们启动的是一个后台线程,而界面上的按钮是属于UI主线程的资源,只能由主线程访问,否则就会出现以下错误:


    委托的方式还有另一种更优雅的方式:
    this.BeginInvoke(new Action(() =>
    {
         button3.Enabled = false;
    }));


    注:设置线程的 IsBackground 为true时,该线程为后台线程(不考虑是否运行完毕,主程序退出后自动退出),否则是前台线程(必须退出所有线程主程序才能退出)。有时,当我们关闭主程序发现进程仍然还在的,就可以考虑是否是没有将执行线程设置为后台线程。

    二、并行循环(Parallel):
    1. using System.Threading.Tasks;
    2. ...

    3. // 限制执行线程数量
    4. ParallelOptions parallelOption = new ParallelOptions();
    5. parallelOption.MaxDegreeOfParallelism = 100;
    6. object locker = new object();
    7. Parallel.ForEach<string>(strList, parallelOption, str =>
    8. {
    9.         lock (locker)
    10.         {
    11.                 // Do something...
    12.         }
    13. });
    复制代码
    C#提供的并行循环处理函数,也可以不指定ParallelOptions,直接调用Parallel.ForEach<string>(strList, str... 即可。
    注意:线程数量并不是越多越好,过多只会增加系统切换线程的开销,具体合适的值需要结合业务调整。建议从10~200测试起。。。
    清泛网 - 专注IT技能提升
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    © 2024 tsingfun.com, Inc.  沪ICP备2020034476号-1  沪公网安备31011702000040号

    GMT+8, 2024-09-20 13:36 , Processed in 0.018215 second(s), 33 queries .