Esileht > Alustus > Eranditöötlus rööpsilmuses

Eranditöötlus rööpsilmuses


Mis saab, kui ühes rööpsilmuse lõimes tekkib erand? Teised silmused lõpetavad töö samamoodi nagu Stop()-meetodi puhul. Erandi poolt tekitatud katkestus on suurema prioriteediga kui Stop() ja Break(), aga siiski lubatakse kõigil lõimedel oma käsilolev tsükkel lõpule viia.

Klassil ParallelLoopState on selline asi nagu IsExceptional, mida pikalt töötavad tsüklid saavad aeg-ajalt kontrollida, et siis kiiremini pillid kotti panna. Alltoodud näites ei ole state.IsExceptional kunagi tõene, sest seda küsitakse tsükli alguses ja uut tsüklit ei alustata kunagi, kui mingi tsükkel on erandi tekitanud. Aga pikema tsükli keskel on küsimusel jumet.

static void Main(string[] args)
{
try
{
Parallel.For(0, 20, (i, state) =>
{
if (state.IsExceptional)
Console.WriteLine("Ups!");
else
{
Console.WriteLine(i);
if (i == 3)
throw new Exception("Ämber");
}
});
}
catch (Exception x)
{
Console.WriteLine(x.Message);
}
}

Kui sa selle koodi käivitad, võid näha, et pärast vea genereerimist lõpetavad tsüklid töö, kus keegi parasjagu on. Silmus ise tekitab erandi “One or more errors occurred” ja rohkem infot sisaldab InnerException.

  1. Kommentaare veel pole.
  1. No trackbacks yet.

Lisa kommentaar

Please log in using one of these methods to post your comment:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Muuda )

Twitter picture

You are commenting using your Twitter account. Log Out / Muuda )

Facebook photo

You are commenting using your Facebook account. Log Out / Muuda )

Google+ photo

You are commenting using your Google+ account. Log Out / Muuda )

Connecting to %s

%d bloggers like this: