还在苦苦敲代码开发APP?你out啦! 试试积木搭建APP吧~

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

来源:清泛原创     2016-06-28 10:44:11    人气:     我有话说( 0 人参与)

一、多线程(Thread):using System.Threading;...Thread t = new Thread(new ThreadStart(delegate{ Proxy(delegat...

一、多线程(Thread):
using System.Threading;
...

Thread t = new Thread(new ThreadStart(delegate
{
        Proxy(delegate
        {
                button3.Enabled = false;
        });

        ...
}));
t.IsBackground = true;
t.Start();
#region 多线程委托

public delegate void ProxyInvoker();

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

        if (this.InvokeRequired)
        {
                this.Invoke(invoke);
                return;
        }

        invoke();
}

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

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


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

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

// 限制执行线程数量
ParallelOptions parallelOption = new ParallelOptions();
parallelOption.MaxDegreeOfParallelism = 100;
object locker = new object();
Parallel.ForEach<string>(strList, parallelOption, str =>
{
        lock (locker)
        {
                // Do something...
        }
});
C#提供的并行循环处理函数,也可以不指定ParallelOptions,直接调用Parallel.ForEach<string>(strList, str... 即可。
注意:线程数量并不是越多越好,过多只会增加系统切换线程的开销,具体合适的值需要结合业务调整。建议从10~200测试起。。。

C# 多线程 并行处理

注:本文为本站或本站会员原创优质内容,版权属于原作者及清泛网所有,
欢迎转载,转载时须注明版权并添加来源链接,谢谢合作! (编辑:admin)
分享到: