您好,登錄后才能下訂單哦!
由于并行計(jì)算中的停止stop和跳出 break,跟單線程中有所不同,所以需要重點(diǎn)理解一下.
停止stop,因?yàn)槭嵌嗑€程,所以當(dāng)調(diào)用stop時(shí),此循環(huán)體沒有立即退出,還會(huì)有一兩個(gè)線程會(huì)繼續(xù)執(zhí)行。
所以有可能會(huì)達(dá)不到我們的要求。
例如:
List<int> list = new List<int>();
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);
}
}
);
執(zhí)行結(jié)果可能如下:
當(dāng)i=6時(shí),調(diào)用stop方法,
但直到i=10,循環(huán)體才停止。
因此,我們要用LoopState.IsStopped屬性來(lái)判斷是否調(diào)用了stop方法,如果調(diào)用,則對(duì)滿足條件下的,才會(huì)繼續(xù)執(zhí)行。
執(zhí)行結(jié)果如下(為可能結(jié)果),符合我們的要求
break,跳出當(dāng)前循環(huán),經(jīng)過執(zhí)行結(jié)果我們發(fā)現(xiàn),也存在其他線程未跳出循環(huán)的情況
所以不能只依靠break了,我們自己要把可以執(zhí)行的代碼放在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
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。