Veysel Uğur KIZMAZ

C# Parallel For - Parallel Foreach

30.04.2012Okunma Sayısı: 15999Kategori: C#.Net

 Hayatımıza .Net Framework 4.0 ile dahil olan paralel döngülerin nasıl çalıştığını ve syntaxının nasıl olduğunu inceleyelim.

Paralel döngüler dediğimiz kavram, for veya foreach’in paralel çalışması olarak belirtilmektedir. For ya da foreach içerisindeki işlemler normal çalıştırıldığında sıralı şekilde çalışmaktadır. Paralel olarak bu döngüleri çalıştırdığımızda ise elemanları sıralı değil paralel şekilde çalıştıracaktır.
Bu işlemin nasıl olduğunu bir örnek üzerinde inceleyelim.
Döngüde Ogrenci türünde bir nesnede tanımlayalım. ID’si 1’den 7’ye kadar olan öğrencileri ekranda for, paralel for, foreach ve paralel foreach ile çağıralım.
Ogrenci.cs
class Ogrenci
    {
        public int Id { get; set; }
        public string AdSoyad { get; set; }
    }
 
1. FOR DÖNGÜSÜ
List<Ogrenci> ogrenciler = new List<Ogrenci>
            {
                new Ogrenci{ Id = 1, AdSoyad = "Veysel Uğur KIZMAZ"},
                new Ogrenci{ Id = 2, AdSoyad = "Emre YAĞMUR"},
                new Ogrenci{ Id = 3, AdSoyad = "Baran KIZMAZ"},
                new Ogrenci{ Id = 4, AdSoyad = "Umutcan SAVUR"},
                new Ogrenci{ Id = 5, AdSoyad = "Halil YILAMZ"},
                new Ogrenci{ Id = 6, AdSoyad = "Hakan ÖZSOY"},
                new Ogrenci{ Id = 7, AdSoyad = "Önder TURAN"},
            };
 
            for (int i = 0; i < ogrenciler.Count; i++)
            {
                Console.WriteLine("Ogrenci ID:" + ogrenciler[i].Id + " - Ad Soyad: " + ogrenciler[i].AdSoyad);
            }
 
 
Ekran çıktısı:
2. PARALEL FOR DÖNGÜSÜ
            List<Ogrenci> ogrenciler = new List<Ogrenci>
            {
                new Ogrenci{ Id = 1, AdSoyad = "Veysel Uğur KIZMAZ"},
                new Ogrenci{ Id = 2, AdSoyad = "Emre YAĞMUR"},
                new Ogrenci{ Id = 3, AdSoyad = "Baran KIZMAZ"},
                new Ogrenci{ Id = 4, AdSoyad = "Umutcan SAVUR"},
                new Ogrenci{ Id = 5, AdSoyad = "Halil YILAMZ"},
                new Ogrenci{ Id = 6, AdSoyad = "Hakan ÖZSOY"},
                new Ogrenci{ Id = 7, AdSoyad = "Önder TURAN"},
            };
 
            Parallel.For(0, ogrenciler.Count, i =>
            {
                Console.WriteLine("Ogrenci ID:" + ogrenciler[i].Id + " - Ad Soyad: " + ogrenciler[i].AdSoyad);
            });
 
 
Paralel for döngüsü dediğimiz yapı aslında For isminde bir fonksiyondan ibarettir. Bu fonksiyonun ilk parametresi başlangıç indeksi, ikinci parametresi bitiş indeksi, son parametresi ise yapılacak işlemi belirtmektedir. i => ile yapılan tanımlama ise indeksin (sayacın) döngü içerisinde kullanılacağı değişkeni belirtmektedir. i yerine istediğimiz bir değişken adını tanımlayabiliriz ve döngü içerisinde bu değişkeni kullanabiliriz.
Projemizi çalıştırdığımızda aşağıdaki gibi bir önceki örnekten farklı bir sonuç elde edeceğiz. Tüm işlemler paralel yapıldığı için her çalıştırmada farklı sonuç elde edilebilmektedir.
3. FOREACH DÖNGÜSÜ
            List<Ogrenci> ogrenciler = new List<Ogrenci>
            {
                new Ogrenci{ Id = 1, AdSoyad = "Veysel Uğur KIZMAZ"},
                new Ogrenci{ Id = 2, AdSoyad = "Emre YAĞMUR"},
                new Ogrenci{ Id = 3, AdSoyad = "Baran KIZMAZ"},
                new Ogrenci{ Id = 4, AdSoyad = "Umutcan SAVUR"},
                new Ogrenci{ Id = 5, AdSoyad = "Halil YILAMZ"},
                new Ogrenci{ Id = 6, AdSoyad = "Hakan ÖZSOY"},
                new Ogrenci{ Id = 7, AdSoyad = "Önder TURAN"},
            };
 
            foreach (Ogrenci ogrenci in ogrenciler)
               {
                Console.WriteLine("Ogrenci ID:" + ogrenci.Id + " - Ad Soyad: " + ogrenci.AdSoyad);
            };
 
 
Ekran çıktısı:
4. PARALEL FOREACH DÖNGÜSÜ
            List<Ogrenci> ogrenciler = new List<Ogrenci>
            {
                new Ogrenci{ Id = 1, AdSoyad = "Veysel Uğur KIZMAZ"},
                new Ogrenci{ Id = 2, AdSoyad = "Emre YAĞMUR"},
                new Ogrenci{ Id = 3, AdSoyad = "Baran KIZMAZ"},
                new Ogrenci{ Id = 4, AdSoyad = "Umutcan SAVUR"},
                new Ogrenci{ Id = 5, AdSoyad = "Halil YILAMZ"},
                new Ogrenci{ Id = 6, AdSoyad = "Hakan ÖZSOY"},
                new Ogrenci{ Id = 7, AdSoyad = "Önder TURAN"},
            };
 
            Parallel.ForEach(ogrenciler, ogrenci =>
               {
                Console.WriteLine("Ogrenci ID:" + ogrenci.Id + " - Ad Soyad: " + ogrenci.AdSoyad);
            });
 
 
Paralel foreach döngüsü dediğimiz yapı aslında Foreach isminde bir fonksiyondan ibarettir. Bu fonksiyonun ilk parametresi işleme alınacak liste ya da diziyi, son parametresi ise yapılacak işlemi belirtmektedir. ogrenci => ile yapılan tanımlama ise döngü içerisinde kullanılacak değişkeni belirtmektedir. ogrenci yerine istediğimiz bir değişken adını tanımlayabiliriz ve döngü içerisinde bu değişkeni kullanabiliriz.
Projemizi çalıştırdığımızda aşağıdaki gibi bir önceki örnekten farklı bir sonuç elde edeceğiz. Tüm işlemler paralel yapıldığı için her çalıştırmada farklı sonuç elde edilebilmektedir.
 
 
Veysel Uğur KIZMAZ
Bilgisayar Mühendisi
veysel@ugurkizmaz.com
www.ugurkizmaz.com