Pertanyaan Pisahkan paralel.


Bagaimana cara saya keluar dari parallel.for lingkaran?

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 bagaimana memecahkan loop paralel? Itu break; pernyataan melempar berikut kesalahan sintaks:

Tidak ada loop yang melingkupinya untuk dipecahkan atau dilanjutkan


75
2017-09-24 18:51


asal


Jawaban:


Menggunakan ParallelLoopState.Break metode:

 Parallel.ForEach(list,
    (i, state) =>
    {
       state.Break();
    });

Atau dalam kasus Anda:

Parallel.ForEach<ColorIndexHolder>(ColorIndex.AsEnumerable(),
    new Action<ColorIndexHolder, ParallelLoopState>((ColorIndexHolder Element, ParallelLoopState state) =>
    {
        if (Element.StartIndex <= I && Element.StartIndex + Element.Length >= I)
        {
            Found = true;
            state.Break();
        }
    }));

125
2017-09-24 18:56



Anda melakukan ini dengan menelepon menggunakan kelebihan Parallel.For atau Parallel.ForEach yang melewati keadaan loop, lalu menelepon ParallelLoopState.Break atau ParallelLoopState.Stop. Perbedaan utamanya adalah pada seberapa cepat hal-hal memecah - dengan Break(), loop akan memproses semua item dengan "indeks" lebih awal dari saat ini. Dengan Stop(), itu akan keluar secepat mungkin.

Untuk detailnya, lihat Cara: Stop atau Break dari Parallel.For Loop.


31
2017-09-24 18:56



Apa yang seharusnya Anda gunakan adalah Any, bukan loop foreach:

bool Found = ColorIndex.AsEnumerable().AsParallel()
    .Any(Element => Element.StartIndex <= I 
      && Element.StartIndex + Element.Length >= I);

Any cukup pintar untuk berhenti begitu mengetahui bahwa hasilnya pasti benar.


11
2017-09-24 18:58



LoopState tentu merupakan jawaban yang bagus. Saya menemukan jawaban sebelumnya memiliki begitu banyak hal lain sehingga sulit untuk melihat jawabannya, jadi ini adalah kasus sederhana:

using System.Threading.Tasks;

Parallel.ForEach(SomeTable.Rows(), (row, loopState) =>
{
    if (row.Value == testValue)
    {
        loopState.Stop();  // Stop the ForEach!
    }       
    // else do some other stuff here.
});

7
2017-07-31 18:13



Cukup gunakan loopState yang bisa disediakan.

Parallel.ForEach<ColorIndexHolder>(ColorIndex.AsEnumerable(),  
    new Action<ColorIndexHolder>((Element, loopState) => { 
        if (Element.StartIndex <= I && Element.StartIndex + Element.Length >= I) { 
            loopState.Stop();
        }     
})); 

Lihat ini Artikel MSDN untuk sebuah contoh.


5
2017-09-24 18:57