清泛IT社区

标题: C# 多线程、并行处理全攻略(持续更新) [打印本页]

作者: 清泛网    时间: 2015-10-23 11:11
标题: C# 多线程、并行处理全攻略(持续更新)
一、多线程(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主线程的资源,只能由主线程访问,否则就会出现以下错误:
(, 下载次数: 2437)

委托的方式还有另一种更优雅的方式:
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社区 (https://bbs.tsingfun.com/) Powered by Discuz! X3.3