Register | Password Reset

Search

Pages

  • Dosyalar
  • Ozgecmis
  • Projeler

Blogs

  • barkmaz.blogspot.com .NET & Sharepoint and Engineering
  • carryonwayward.com invalid karamela sepeti
  • konuralp.gen.tr Alper Konuralp’in Blog Sitesi
  • onderozcan.blogspot.com Önder ÖZCAN

Softwares

  • Debian Universal Operating System
  • EasyWords Learn New Words
  • Opera Faster & Safer Internet

Tag Cloud

.net api books browser c# captcha chrome cleartype cloud code desktop desktop tools encoding firefox font games gelecek google graphics gsm internet explorer lambda library linux live cd moba opengl opera operating system optimization organization prıvacy put.io recaptcha search silverlight task parallel library threading type casting userscript utility windows 7 windows vista wpf xaml
RSS feed


Archive

Posts Tagged ‘task parallel library’

Task Parallel Library

Eser Ozvataf November 8th, 2011 No comments

Diskden bir klasör içerisindeki tüm dosyaları okumak, elimizde bulunan birden fazla URL adresinden feedleri veya web sayfalarını download etmek ve elimizdeki verilerin güncel kopyalarının olup olmadığını kontrol etmek. Bütün bu örnekler için genellikle bir döngü yapısı kullanırız. Fakat kodu yazma amacımız belirli bir sırayı takip etmesi değil de, tüm sistem kaynaklarını kullanarak işlemi gerçekleştirmesi olduğunda birden fazla thread ile işlem yapmak en uygun çözümdür.

Threading’le ilgili biraz bilginiz varsa “Producer/Consumer Queue” kavramını duymuşsunuzdur. Bu kavramı en basit haliyle “dış bir kaynaktan beslenen iş kuyruğu, ve bu iş kuyruğundan objeleri çeken birden fazla thread” olarak tanımlayabiliriz.

Klasik thread yaklaşımında kullanacağımız kadar thread oluşturur ve bu threadlerin sürekli veya iş kuyruğu tamamiyle boşalana kadar kuyruktaki objeleri aldığı bir yapı oluştururuz. Yönetimi low-level bilgi gereksinimi istediğinden zor ve mantık hatalarına açık bir yöntemdir.

.NET CLR bu nedenle .NET 2.0 ile birlikte ThreadPool yapısı, ardından .NET 4.0 ThreadPool üzerine oturttuğu daha high-level bir yapı olan TPL yani Task Parallel Library ile oluşabilecek sorunlar konusunda yazılımcılara çözümler sunmakta. ThreadPool ve TPL’in çalışma mekaniği yapılacak her kalem iş’e bir Task (Görev) olarak bakmak, ve bu işleri yazılımcının yalnızca tanımlayıp kodların işletim kısmıyla ilgilenmemesini, ancak bu görevleri iptal etmek veya görevler tamamlandığında haberdar olmak gibi genel kısımlarda yazılımcının kod yazmasını sağlar.

Fakat .NET 4.0 ile gelip, işlemcinin sanal/fiziksel tüm çekirdeklerini sonuna kadar kullanmamızı sağlayan TPL’in bir kaç eksikliğinin olduğunu fark ettim. Çalışacak maximum thread sayısına biz karar veremiyoruz, dolayısıyla vermiş olduğumuz her kalem iş .NET tarafından içeride bir yerlerde kuyruğa dahil edildiğinden kod ile bu kuyruğu izleyemiyoruz.

Bu nedenle kendi yazdığım ve aslında daha büyük bir Framework’ün parçası olan Channel sınıfını burada paylaşmak istiyorum.

Örnek Kullanım:

// yapılacak her iş için çalışacak action delegate'ini tanımlayalım
Action<object> _action = new Action</object><object>(delegate(object obj) {
	// yapılacak iş objesi delegate'e parametre olarak geldi
	Console.Write("{0}\t", obj);
});

// belirttiğimiz action delegate'ini her iş için maximum 5 thread halinde çalıştıracak Channel sınıfını oluşturalım
Channel _channel = new Channel(5, _action);

// kuyruğa dummy olarak 1000 adet iş objesi ekleyelim
for(int _i = 0;_i < 1000;_i++) {
	_channel.AddTask(_i);
}

// işlerin oluşturulmasına başla
_channel.Fill();

Categories: .NET Tags: .net, c#, code, task parallel library, threading
Page 1 of 11

eser.ozvataf.com.