.Net 4.0 ile birlikte gelecek güzel class’lardan bir tanesi de Task class’ı.
Task class’ı ve TPL (Task Parallel Library) ile birlikte gelen diğer class’lar sayesinde paralel programlama .net framework ile desteklenir hale geliyor.
Yandaki görselde görebileceğiniz gibi, TPL (Task Parallel Library) ve PLINQ (Parallel LINQ) .Net Framework 4.0 ile gelen en önemli özellikler.
Paralel programlamanın performans’a katkısını MSDN’de yer alan şu iki makale’de okuyabilirsiniz;
Parallel Programming in .Net Framework
Gene MSDN’de yer alan şu sayfalardan da .net 4 ile gelecek yeni yapıları öğrenebilirsiniz;
Data Structures for Parallel Programming
Task Parallelism (Task Parallel Library)
Task class’ını kullanarak, Thread yönetme maliyetlerinden kurtularak kolaylıkla Multi-Core uyumlu, Asenkron çalışabilen kodlar yazabiliriz.
Task class’ından yeni bir örnek oluşturmak için;
Aşağıdaki gibi yeni bir instance oluşturup, daha sonra Start method’u ile başlatabiliriz.
Task t0 = new Task(() => MessageBox.Show(“Task Örneği 1”) ); t0.Start();</pre> Veya, aşağıdaki kodda yazdığım gibi, Task class’ının singleton static Factory property’sinin StartNew method’u ile hem tanımlayıp, aynı anda başlatabiliriz.
Task t1 = Task.Factory.StartNew(() => { string Mesaj = "Birinci çalışacak.."; MessageBox.Show(Mesaj); });
Örneğini oluşturduğumuz Task nesnesi, başlatılana kadar hafızada bekler. Başlatıldığında, ayrı bir thread’de çalışacağından dolayı, uzun süren işlerin arayüz’ü kilitlemesini önlemek için kullanılabilir.
Birden Fazla Task’ın peşpeşe çalışması sağlanabilir;
Task t2 = Task.Factory.StartNew(() => { MessageBox.Show("Birinci çalışacak.."); }).ContinueWith((t) => { MessageBox.Show("İkinci çalışacak.."); }).ContinueWith((t) => { MessageBox.Show("Üçüncü çalışacak.."); });
Veya birden fazla Task’ın aynı anda çalışması da sağlanabilir;
Task t3 = Task.Factory.StartNew(() => { Task c1 = Task.Factory.StartNew(() => { MessageBox.Show("Aynı anda çalışacak.."); }, TaskCreationOptions.AttachedToParent); Task c2 = Task.Factory.StartNew(() => { MessageBox.Show("Aynı anda çalışacak.."); }, TaskCreationOptions.AttachedToParent); }); *TaskCreationOptions* parametresine verdiğimiz *AttachedToParent* değerine dikkat!.. Bu sayede c1 ve c2 Task'ları t3 Task'ının **Child Task**'ları haline geldi, t3 Task'ı da **Parent Task** oldu.
Senior Software Engineer, @Microsoft
Ada ve Ege'nin babası ;)
Makale Adedi: 484