C#学习之路-任务、线程(一)

本文介绍并行编程的概念,包括任务并行性和数据并行性,并详细讲解了.NET框架中Parallel类的方法,如For、Foreach及Invoke等,同时展示了如何管理和调度线程池中的线程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

线程是程序中独立的指令流。
进程包括资源,每一个进程都分配了虚拟指令流。
一个进程至少包含一个线程,操作系统会调度线程。线程有一个优先级、实际上正在处理的程序的位置计数器、一个存储器局部变量的栈。
每个线程都有自己的栈,但程序代码的内存和堆由一个进程的的所有线程共享,这使一个进程的所有线程之间的通信非常快-该进程的所有线程都寻址相同的虚拟内存。
任务并行性:使用CPU的代码被并行化,CPU的多个核心会被利用起来,更快速的完成包含多个任务的活动,而不是在一个核心一个一个的执行。
数据并行性:使用了数据集合,在集合上执行的工作被划分为多个任务
1.Parallel 类是对线程的一个很好的抽象,提供了任务和数据并行性。
1>Parallel.For()方法:前两个参数定义了循环的开头和结束。第三个参数可以是一个Action<int> 委托,用来代表循环的迭代次数;还可以重载为Action<int,ParalleLoopState>,可以调用ParallelLoopState的Break()和Stop()方法.返回ParallelLoopResult 它提供循环是否结束的信息。
它还可以接受三个委托参数,第一个参数是Func<TLocal>,第二个参数是Func<int,ParallelLoosState,TLocal>,第三个参数是Action<TLocal>。
取消方法 第三个参数 new ParallelOption(){},x=>{});
await Task.Delay(10) 是一个异步方法,用于释放线程供其他任务使用。

示例如下:

 ParallelLoopResult result = Parallel.For(0, 10, i =>
           {
               Console.WriteLine("{0},task:{1},thread:{2}", i, Task.CurrentId,
                   Thread.CurrentThread.ManagedThreadId);
               Thread.Sleep(10);
           });
            Console.WriteLine("Is Finished:{0}", result.IsCompleted);

2>Parallel.Foreach()方法:异步方法遍历,没有确定遍历顺序;重载方法同Parallel.For();

示例如下:

ParallelLoopResult result2 = Parallel.For(0, 40, async (int x, ParallelLoopState s) =>
            {
                Console.WriteLine("{0},task:{1}", x, System.Threading.Tasks.Task.CurrentId);
                await Task.Delay(10);
                if (x>15) s.Break();
            });
            Console.WriteLine("Break Iteration:{0}", result2.LowestBreakIteration);

3>Parallel.Invoke()方法:提供了任务并行,Parallel.Invoke(function1(),function2());
要启动任务可以使用TaskFactory类,在其中把方法传递给StartNew方法;2,使用Task类的静态方法Factory访问TaskFactory类的StartNew()方法;3,使用Task类的构造函数,调用Start();4,使用task的Run().
var tf=new TaskFactory(); Task t1=tf.StartNew(function1()); Task t2=Task.Factory.StartNew(); Task t3=new Task(function()); t3.Start(); Task t4=Task.Run(()=>funcion())
Task t2=t1.ContinueWith(SecondFunction);Task t3=t1.ContinueWith(DoSecond,TaskContinuationOptions.OnlyOnFauled);
TaskContinuationOptions的枚举值 OnlyOnFaulted,NotOnFaulted,OnlyOnCanceled,NotOnCanceled.
ThreadPool类,在需要时增加线程池中的线程数,直到最大的线程数。线程池的最大线程数是可配置的。在四核CPU中默认1023哥哥工作线程和1000个I/O线程。可以在创建线程池的时候指定最小火最大的线程数。
线程池中的个数达到极限,新任务会进行排队。

示例:

 int workThreads;
            int completionPortThreads;
            ThreadPool.GetMaxThreads(out workThreads,out completionPortThreads);
            Console.WriteLine("Max{0},I/O{1}",workThreads,completionPortThreads);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值