Linq to potężne narzędzie, dzięki któremu można zrobić złożone rzeczy małą ilością kodu. Oto przykład:
XDocument doc = XDocument.Load("data.xml"); var r = from page in doc.Element("prizes").Elements().AsParallel() .WithDegreeOfParallelism(16) .WithExecutionMode(ParallelExecutionMode.ForceParallelism) from prize in page.Elements("item") let points = prize.Element("points").Value select new Price() { Category = page.Element("header").Value .Substring("Nagrody w kategorii: ".Length), Name = prize.Element("title").Value, Content= prize.Element("content").Value, ImagePath = GetImage(prize.Element("image").Value), Points = Convert.ToInt32( points.Substring(0,points.Length-3).Replace(" ", "")) };
Co robi powyższe zapytanie? Otóż z pewnego xml’a wybiera ono wszystkie elementy będące nagrodami (tag item) i mapuje je na postać obiektową. Co ciekawe metoda GetImage pobiera obrazek z internetu skojarzony z nagrodą. Niestety sekwencyjne wykonanie jest stosunkowo wolne, bo jest to zewnętrzna operacja IO. Korzystając z PLinq możemy to bardzo łatwo i szybko zmienić. Wystarczy użyć extension metody AsParallel. Od tej wchili analiza, mapowanie i ściąganie obrazków odbywać się będzie rownolegle dla kilku nagród. Czy nie jest to proste?