Bagaimana cara keluar dari loop parallel.for ?
Saya memiliki pernyataan yang cukup rumit yang terlihat seperti berikut:
Parallel.ForEach<ColorIndexHolder>(ColorIndex.AsEnumerable(),
new Action<ColorIndexHolder>((ColorIndexHolder Element) =>
{
if (Element.StartIndex <= I && Element.StartIndex + Element.Length >= I)
{
Found = true;
break;
}
}));
Menggunakan kelas paralel, saya dapat mengoptimalkan proses ini sejauh ini. Namun; Saya tidak tahu cara memutus loop paralel? The break;
pernyataan melempar kesalahan berikut sintaks:
Tidak ada loop penutup yang akan diputus atau dilanjutkan
c#
multithreading
parallel-processing
parallel.foreach
Rasmus Søborg
sumber
sumber
Jawaban:
Gunakan
ParallelLoopState.Break
metode:Atau dalam kasus Anda:
sumber
Calling the Break method informs the for operation that iterations after the current one don't have to execute. However, all iterations before the current one will still have to be executed if they haven't already.
danthere is no guarantee that iterations after the current one will definitely not execute.
state.Stop()
lebih tepat untuk secara andal mencapai hasil yang diharapkan, seperti yang disebutkan di bawah ini oleh Mike Perrenoud dan MBentleyAnda melakukan ini dengan memanggil menggunakan overload dari
Parallel.For
atauParallel.ForEach
yang lewat dalam keadaan loop, lalu memanggilParallelLoopState.Break
atauParallelLoopState.Stop
. Perbedaan utama adalah pada seberapa cepat hal-hal rusak - denganBreak()
, loop akan memproses semua item dengan "indeks" yang lebih awal daripada saat ini. DenganStop()
, itu akan keluar secepat mungkin.Untuk detailnya, lihat Cara: Berhenti atau Putus dari Paralel . Untuk Loop .
sumber
Apa yang harus Anda gunakan adalah
Any
, bukan loop foreach:Any
cukup pintar untuk berhenti begitu mengetahui bahwa hasilnya pasti benar.sumber
LoopState tentu saja merupakan jawaban yang bagus. Saya menemukan jawaban sebelumnya memiliki begitu banyak hal lain sehingga sulit untuk melihat jawabannya, jadi inilah kasus sederhana:
sumber
Gunakan saja
loopState
yang bisa disediakan.Lihat artikel MSDN ini sebagai contoh.
sumber