???那么采集点数较少时使用同步,采集点数过多时使用异步这个属于哪个限制导致的多线程问题??
ParallelOptions
Parallel的静态For,ForEach和Invoke方法都提供了接受一个ParallelOptions对象的重载版本。
public class ParallelOptions{
public ParallelOptions();
public CancellationToken cancellationToken{get;set;}//取消操作,默认为CancellationToken.None
public Int32 MaxDegreeOfParallelism{get;set;}//允许指定可以并发操作的最大工作项数目,默认为-1(可用CPU数)
public TaskScheduler TaskScheduler{get;set;}//使用哪个TaskScheduler,默认为TaskScheduler.Default
}
For,ForEach的三个操作的重载版本
任务局部初始化委托(localInit),为参与工作的每个任务都调用一次该委托。这个委托时在任务被要求出来一个工作项之前调用的。
主体委托(body),为参与工作的各个线程所处理的每一项都调用一次该委托
任务局部终结委托(localFinally),为参与工作的每一个任务都调用一次该委托。这个委托是在任务处理好派发给它的所有工作项之后调用的。即时主体委托代码引发一个未处理的异常,也会调用它。
此调用的参数较复杂,具体参见MSDN
ParallelLoopState对象
参与工作的每个任务都获得它自己的ParallelLoopState对象,并可通过这个对象和参与工作的其他任务进行交互。
public class ParallelLoopState{
public void Stop();//告诉循环停止处理任何更多的工作
public Boolean IsStopped{get;}
public void Break();//告诉循环不再处理当前项之后的项
public Int64? LowestBreakIteration{get;}
public Boolean IsExceptional{get;}
public Boolean ShouldExitCurrentIteration{get;}//是否可以提前退出
}
ParallelLoopResult对象
Parallel的静态For,ForEach方法都返回一个ParallelLoopResult实例
public struct ParallelLoopResult
{
//如果操作提前终止,以下方法返回false
public Boolean IsCompleted{get;}
public Int64? LowestBreakIteration{get;}
}