进程包括资源,每一个进程都分配了虚拟指令流。
一个进程至少包含一个线程,操作系统会调度线程。线程有一个优先级、实际上正在处理的程序的位置计数器、一个存储器局部变量的栈。
每个线程都有自己的栈,但程序代码的内存和堆由一个进程的的所有线程共享,这使一个进程的所有线程之间的通信非常快-该进程的所有线程都寻址相同的虚拟内存。
任务并行性:使用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);
示例如下:
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);
要启动任务可以使用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);