重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
由于并行计算中的停止stop和跳出 break,跟单线程中有所不同,所以需要重点理解一下.
创新互联建站是专业的临桂网站建设公司,临桂接单;提供网站建设、成都网站建设,网页设计,网站设计,建网站,PHP网站建设等专业做网站服务;采用PHP框架,可快速的进行临桂网站开发网页制作和功能扩展;专业做搜索引擎喜爱的网站,专业的做网站团队,希望更多企业前来合作!
停止stop,因为是多线程,所以当调用stop时,此循环体没有立即退出,还会有一两个线程会继续执行。
所以有可能会达不到我们的要求。
例如:
List
for (int i = 0; i < 20; i++)
{
list.Add(i);
}
Console.WriteLine("Stop");
Parallel.For(0, list.Count,
(i, LoopState) =>
{
Thread.Sleep(500);
Console.WriteLine(i);
if (i > 5) LoopState.Stop();
// if (LoopState.IsStopped == false)
{
Console.WriteLine(" ............." + i);
}
}
);
执行结果可能如下:
当i=6时,调用stop方法,
但直到i=10,循环体才停止。
因此,我们要用LoopState.IsStopped属性来判断是否调用了stop方法,如果调用,则对满足条件下的,才会继续执行。
执行结果如下(为可能结果),符合我们的要求
break,跳出当前循环,经过执行结果我们发现,也存在其他线程未跳出循环的情况
所以不能只依靠break了,我们自己要把可以执行的代码放在if代码段中。
Console.WriteLine("Break");
Parallel.For(0, list.Count,
(i, LoopState) =>
{
Console.WriteLine(i);
Thread.Sleep(500);
if (i > 5) LoopState.Break();
{
Console.WriteLine("----------" + i);
}
}
);
改为
Console.WriteLine("Break");
Parallel.For(0, list.Count,
(i, LoopState) =>
{
Console.WriteLine(i);
Thread.Sleep(500);
if (i > 5) LoopState.Break();
else//加上else
{
Console.WriteLine("----------" + i);
}
}
);
L