C# ile İş Parçacığı Oluşturma ve Başlatma

C# ile İş Parçacığı Oluşturma ve Başlatma

C# ile iş parçacığı oluşturma ve başlatma üstesinden gelinmesi gereken en zorlu sorunlardan biridir Bu yazıda, C# kullanarak iş parçacığı oluşturma ve başlatma işlemi nasıl gerçekleştirilir açıklıyoruz Sorunlarınızı çözmek için okuyun!

C# ile İş Parçacığı Oluşturma ve Başlatma

Programlar her zaman tek bir görevle sınırlı kalmaz. Programların birden fazla görevi eşzamanlı olarak yapabilmesi için iş parçacıkları kullanılır. İş parçacığı, bir program içinde aynı anda birden fazla görevi yürütmek için kullanılan bir yapıdır. Bu işlemi C# ile gerçekleştirmek de oldukça kolaydır.

Bu makalede, C# kullanarak iş parçacığı oluşturmanın ve başlatmanın farklı yöntemleri ele alınacaktır. Thread sınıfı, Task sınıfı ve Parallel sınıfı gibi yapılar yardımıyla C# ile iş parçacığı oluşturmak mümkündür.


İş Parçacığı Nedir?

İş parçacığı, programlama dilinde oldukça önemli bir konudur. Bir program içinde aynı anda birden fazla görevin yürütülmesi gerektiğinde, iş parçacıkları kullanılır. Bu sayede, her bir görev farklı bir iş parçacığında yürütülerek, programın daha hızlı ve etkili bir şekilde çalışması sağlanır.

İş parçacıkları, C# gibi programlama dillerinde oldukça popülerdir. C# ile iş parçacığı oluşturmanın farklı yöntemleri bulunmaktadır. Bu yöntemler arasında, Thread sınıfı, Task sınıfı ve Parallel sınıfı kullanılarak iş parçacıkları oluşturulabilmektedir.

İş parçacıkları, hemen hemen her alanda kullanılabilecek bir yapıdır. Özellikle web geliştirme, büyük veri işleme ve mobil uygulama geliştirme gibi alanlarda oldukça yaygın olarak kullanılmaktadır. Bu nedenle, C# ile iş parçacığı oluşturma ve yönetme konuları, programlamayı öğrenenler için oldukça önemlidir.


Thread Sınıfı ile İş Parçacığı Oluşturma

C# programlama dili ile birden fazla görevi aynı anda yürütmek için iş parçacıkları kullanılır. İş parçacıkları, program içerisinde yürütülen farklı süreçleri yönetmek için kullanılan araçlardır. Thread sınıfını kullanarak bu işlemi gerçekleştirmek mümkündür.

Thread sınıfı, System.Threading namespace'inin bir parçasıdır ve C# ile iş parçacığı oluşturma işlemini yürütür. Bu sınıfın kullanımı oldukça basit ve işlevseldir. Öncelikle, bir iş parçacığı oluşturmak için Thread sınıfının constructor'larından birisi kullanılır.

Thread sınıfının yapıcı metotları aracılığıyla iş parçacığı başlatılabilir. Bu yapıcı metotlar; yeni bir iş parçacığı başlatmak için kullanılan Thread () yapıcısı, parametreli bir yöntem çağırmak için kullanılan ParameterizedThreadStart (Object) yapıcısı ve parametresiz bir yöntem çağırmak için kullanılan ThreadStart () yapıcısıdır. Bu yapıcı metotların kullanımı örneklerle açıklanarak daha iyi anlaşılabilir.


Thread Sınıfı Yapıcıları

Thread sınıfı, C# ile iş parçacığı oluşturmak için kullanılan bir yapıdır. Bu sınıfın birçok yapıcı metodu bulunmaktadır. Örneğin, ParameterizedThreadStart metodu, parametreli bir iş parçacığı başlatmak için kullanılır. ThreadStart metodu ise, parametresiz bir iş parçacığı başlatmak için kullanılır.

Ayrıca, Thread sınıfı birçok özellik içermektedir. IsAlive özelliği, iş parçacığının hala çalışıp çalışmadığını kontrol etmek için kullanılır. Name özelliği ise, iş parçacığına bir ad verir.

Yapıcı Metot Açıklama
Thread(ThreadStart) Parametresiz bir iş parçacığı oluşturur ve başlatır.
Thread(ParameterizedThreadStart) Parametreli bir iş parçacığı oluşturur ve başlatır.
Thread(ThreadStart, Int32) Parametresiz bir iş parçacığı oluşturur, başlamadan önce belirtilen süre boyunca bekler.
Thread(ParameterizedThreadStart, Int32) Parametreli bir iş parçacığı oluşturur, başlamadan önce belirtilen süre boyunca bekler.

Thread sınıfı, C# ile iş parçacığı oluşturmanın en temel yapılarından biridir ve her programcının bilmesi gereken bir yapıdır.


ParameterizedThreadStart Metodu

C# ile iş parçacığı oluşturmanın farklı yöntemlerinden biri de ParameterizedThreadStart metodu kullanarak parametreli bir iş parçacığı başlatmaktır. Bu metot, belirtilen bir nesne veya nesne dizisi ile birlikte bir iş parçacığı oluşturur ve başlatır. Yani, iş parçacığı başlatılırken parametreler de geçirilebilir.

ParameterizedThreadStart metodu, tek bir nesnenin veya nesne dizisinin işlemini yürütmek için kullanılabilir. Örneğin, bir okuma işlemi gerçekleştiren bir iş parçacığını başlatmak istiyorsak, iş parçacığına dosya yolunu parametre olarak gönderebiliriz. Bu şekilde, oluşturduğumuz iş parçacığı, belirtilen dosyayı okuyarak işlemini gerçekleştirebilir.

Parametreli bir iş parçacığı oluşturmak için, ilk önce bir Thread nesnesi oluşturulur. Ardından, Thread sınıfı yapıcısını ParameterizedThreadStart türüne dönüştürerek kullanılır. Son olarak, Thread nesnesinin Start metodu kullanılarak iş parçacığı başlatılır ve parametreler de geçirilir.

ParameterizedThreadStart Metodu Örneği
static void Main(string[] args){    Thread t = new Thread(new ParameterizedThreadStart(Work));    t.Start("Hello, World!");}static void Work(object obj){    string message = (string)obj;    Console.WriteLine(message);}
Bu örnekte, Work metodu parametre olarak bir string alır. Main metodu içinde oluşturulan Thread nesnesi, Work metodu ve bir string örneği gönderilerek başlatılır. Sonuç olarak, çıktı olarak "Hello, World!" yazdırılır.

Böylece, ParameterizedThreadStart metodu kullanarak C# ile parametreli iş parçacıkları oluşturmak oldukça basittir. Bu yöntem, iş parçacığının işlevselliğini artırır ve daha esnek bir paralelleştirme sağlar.


ThreadStart Metodu

ThreadStart metodu, C# ile iş parçacığı oluşturmanın farklı bir yöntemidir ve özellikle parametre kullanmadan iş parçacığı oluşturmak için kullanılır. Bu metot, iş parçacığının kodunu belirleyen bir delegasyon referansı alır ve uygun şekilde iş parçacığını başlatır.

Aşağıdaki örnek kod bloğu, ThreadStart metodunu kullanarak bir iş parçacığı oluşturur ve çalıştırır:

Thread t1 = new Thread(new ThreadStart(MyFunc));t1.Start();

Bu örnekte, MyFunc adlı bir metot iş parçacığının kodunu belirler. Ardından, Thread sınıfının yapıcısını kullanarak bir Thread türü oluşturulur. MyFunc metodu, parametre kullanmadığı için ThreadStart yapısına bağlanır ve t1.Start() metodunu kullanarak iş parçacığı çalıştırılır. Bu yöntem, parametre kullanımını gereksiz hale getirir ve daha basittir.

ThreadStart metodu, farklı iş parçacığı senaryolarında kullanılabilir ve kodun açıklığını sağlar. Ancak, parametreli metotlar oluşturmanız gerektiğinde, ParameterizedThreadStart metodu kullanmanız önerilir. Her ikisi de Thread sınıfı tarafından sağlanır ve C# ile iş parçacığı oluşturma konusunda son derece esnek ve kullanışlıdır.


Thread Sınıfı Özellikleri

Thread sınıfı, C# ile iş parçacığı yönetiminde birçok özelliğe sahiptir. En önemli özelliklerinden biri, iş parçacığının hala çalışıp çalışmadığını kontrol etmek için kullanılan IsAlive özelliğidir. Bu özellik, iş parçacığı öldürüldükten sonra bile bir süre daha true değeri döndürür.

Bunun yanı sıra, Name özelliği ile iş parçacığına bir isim verilebilir. Bu özellik, programcının iş parçacığını takip etmesini kolaylaştırır. Diğer bir özellik ise Priority özelliğidir. Bu özellik, iş parçacığının öncelik düzeyini belirlemek için kullanılır. Varsayılan olarak, bir iş parçacığının öncelik düzeyi Normal olarak ayarlanır.

Ayrıca, ThreadState özelliği de iş parçacığının anlık durumunu belirlemek için kullanılır. Bu özellik, ThreadState isimli bir enum tipinde değerler döndürür. Örneğin, Running, Stopped, WaitSleepJoin gibi değerler iş parçacığı durumu hakkında bilgi verir. Timeout özelliği ile iş parçacığına zaman sınırı getirilebilir. Join özelliği, bir iş parçacığının bitmesini beklemek için kullanılır.

Thread sınıfı, iş parçacığı yönetiminde birçok özellik sunar ve programcıların iş parçacıklarını yönetmesi için gerekli araçları sağlar.


IsAlive Özelliği

C# ile iş parçacığı oluşturmanın avantajlarından biri, birden fazla görevin eş zamanlı ve hızlı bir şekilde yürütülmesidir. Ancak, iş parçacığı başlatıldıktan sonra, yapılacak son kontrol işlemi oldukça önemlidir. Tam olarak ne zaman bitirildiğini bilmek, ileride oluşabilecek hataları önlemeye yardımcı olabilir. İşte burada, IsAlive özelliği devreye girer.

IsAlive özelliği, bir iş parçacığının hala çalışıp çalışmadığını kontrol etmek için kullanılır. Thread sınıfının bir özelliği olan IsAlive, bir iş parçacığının durumunu kontrol etmek için ideal bir özelliktir. True/false değeri döndüren IsAlive, iş parçacığının çalışıp çalışmadığına dair önemli bir bilgi sağlar.

IsAlive özelliği, aynı zamanda Thread.Join yöntemiyle birlikte kullanılarak, bir iş parçacığının tamamlanmasını beklemek için de kullanılabilir. Bu, bir iş parçacığının diğer iş parçacığından önce bitirilmesi gerektiğinde kullanışlı bir özelliktir.

Aşağıdaki örnek kod, IsAlive özelliğinin nasıl kullanılacağını göstermektedir:

Thread t = new Thread(SomeMethod);t.Start();while (t.IsAlive){    //iş parçacığı hala çalışıyor}Console.WriteLine("İş parçacığı tamamlandı.");

Görüldüğü gibi, while döngüsü içinde IsAlive özelliği kullanarak, iş parçacığının durumu kontrol edilir. İş parçacığı bitene kadar, döngü devam eder ve tamamlandığında "İş parçacığı tamamlandı." mesajı yazdırılır.


Name Özelliği

Name özelliği, bir iş parçacığına bir isim vermek için kullanılır. Bu özellik, iş parçacığının adını Thread nesnesinin başlatan metodu içinde atanarak belirlenir. Örneğin, aşağıdaki kod blogunda, "WorkerThread" adıyla bir iş parçacığı oluşturulur:

Kod Açıklama
public static void Main(){    Thread workerThread = new Thread(WorkerMethod);    workerThread.Name = "WorkerThread";    workerThread.Start();}
Bu kod blogunda, WorkerMethod adlı bir metot çağrılır ve Name özelliği kullanılarak iş parçacığına "WorkerThread" adı atanır.

İsim özelliği, iş parçacığı takibini kolaylaştırmak için yararlı olabilir. Örneğin, bir dizi iş parçacığı başlattığınızda, her birinin ne iş yaptığını belirlemek için birer ad atayabilirsiniz. Bu şekilde, hata ayıklama sürecinde hangi iş parçacığının çöktüğünü ve nedenini daha kolay belirleyebilirsiniz.


Task Sınıfı ile İş Parçacığı Oluşturma

C# ile iş parçacığı oluşturmanın bir diğer yolu da Task sınıfını kullanmaktır. Bu yöntem, Thread sınıfının yerine kullanılabilecek bir yapıdır ve daha gelişmiş özelliklere sahiptir.

Task sınıfının birçok yapıcı metodu ve metodu mevcuttur. Bunlardan en yaygın kullanılanı Task.Run metotudur. Bu metot, yeni bir iş parçacığı oluşturur ve çalıştırır. Örneğin, aşağıdaki kod bloğu bir Task oluşturma örneğidir:

Task myTask = Task.Run(() => {     //iş parçacığı kodu buraya yazılır });

Task sınıfı, bir iş parçacığının tamamlanmasını beklemek için Task.Wait metotuna sahiptir. Bu metot, iş parçacığının sonlanmasını bekler ve devam eden işlemi dondurur. Aşağıdaki örnek, Task.Wait metodu kullanılarak iş parçacığının tamamlanmasını bekleyen bir örnektir:

Task myTask = Task.Run(() => {     // iş parçacığı kodu buraya yazılır });myTask.Wait();

Task sınıfının bir diğer özelliği de, birden fazla iş parçacığı fonksiyonunu birleştirmek için kullanılan Task.WhenAll metotudur. Bu metot, bir dizi Task örneği alır ve tüm iş parçacıklarının tamamlanmasını bekler.

Task sınıfı ayrıca, bir iş parçacığının iptal edilmesini sağlayan CancellationToken özelliğine de sahiptir. Bu özellik, bir iş parçacığına daha fazla kaynak ve süre ayrılamaması durumunda iş parçacığını başarıyla iptal etmek için kullanılır.


Task Sınıfının Yapıcıları ve Metodları

Task sınıfı, C# dilinde iş parçacıkları oluşturma yolundan biridir. Bu sınıf ile birlikte, başlangıç noktasında yeni bir iş parçacığı oluşturabilirsiniz. Task sınıfının kullanımı için, birçok yapıcı ve metot seçeneği mevcuttur. Bu yapıcılar ve metotlar arasında şunlar yer almaktadır:

Yapıcı / Metot Açıklama
Task() Boş bir görev oluşturur.
Task(Action) Bir eylem parametresi alır ve bu eylemi yürütmek üzere bir görev oluşturur.
Task(Func) Bir sonuç döndüren bir işlemi yürütmek üzere bir görev oluşturur.
Task(Action, CancellationToken) Bir eylem ve iptal belirteci parametreleri alır ve bu eylemi yürütmek üzere bir görev oluşturur.

Task sınıfının bazı metotları ise şunlardır:

  • Task.Run(Action): Yeni bir görev başlatır ve belirtilen işlemi yürütür.
  • Task.Factory.StartNew(Action): Belirtilen işlemi içeren yeni bir görev başlatır.
  • Task.Wait(): Bir görevin tamamlanmasını bekler.
  • Task.Delay(millisecondsDelay): Belirtilen süre kadar gecikme ekler.

Bu yapıcılar ve metotlar, C# ile iş parçacığı oluşturma konusunda daha fazla esneklik sağlar ve işleri daha kolay hale getirir.


Task.Run Metodu

Task sınıfı, C# ile iş parçacığı oluşturma konusunda oldukça kullanışlı bir araçtır. Bu sınıfın bir metodu olan Task.Run, yeni bir iş parçacığı oluşturma ve çalıştırma işlemini kolaylaştırır.

Task.Run metodu, oluşturulacak yeni iş parçacığını belirtmek için bir fonksiyon veya lambda ifadesi alır. Bu fonksiyon veya lambda ifadesi, iş parçacığında yürütülecek olan işlemleri tanımlar.

Task.Run metodu ayrıca, oluşturulan bu iş parçacığını paralel olarak çalıştırır. Yani, ana program akışı işlemine devam ederken, oluşturulan iş parçacığı bağımsız olarak çalışır ve işlemlerini tamamlar.

Örneğin, aşağıdaki örnek kod, Task.Run metodu kullanılarak yeni bir iş parçacığı oluşturur ve çalıştırır:

Kod:
Task.Run(() => { Console.WriteLine("Yeni iş parçacığı"); });

Bu kod, yeni bir iş parçacığı oluşturacak ve sadece "Yeni iş parçacığı" yazısını konsol ekranına yazdıracaktır. Bu işlem, ana program akışına kesinti vermeden bağımsız olarak çalışacaktır.


Task.Wait Metodu

Task.Wait metodu, bir iş parçacığının tamamlanmasını beklemek için kullanılır. Bu metot, bekleyen iş parçacığının tamamlanana kadar akışı bloke eder. Eğer işlem tamamlanmışsa, metot hiçbir şey yapmadan sona erer.

Task.Wait metodu, herhangi bir olası hata durumunda, iş parçacığının yürütmeyi durdurmasına neden olabilir. Bu yüzden kullanırken dikkatli olmak gerekir.

Bu metodu kullanırken, zamanlanan iş parçacığının tamamlanmasını bekleme süresi belirtilmelidir. Bu süre, belirlendiği kadar bekleyecektir ve sonra akış sürdürülecektir.

Bunun için, aşağıdaki örnek kullanılabilir:

Örnek Kod
Task task = new Task(() =>{    // işlem yapılacak kod bloğu});task.Start();if (task.Wait(5000)) //5 saniye bekleniyor{    Console.WriteLine("İşlem tamamlandı!");}else{    Console.WriteLine("İşlem tamamlanamadı!");}

Bu örnekte, bir iş parçacığı başlatılıyor ve beş saniye boyunca işlem tamamlanana kadar bekleniyor. İşlem tamamlanırsa, "İşlem tamamlandı!" yazdırılırken, işlem tamamlanmazsa "İşlem tamamlanamadı!" yazdırılır.


Parallel Sınıfı ile İş Parçacığı Oluşturma

Parallel sınıfı, C# ile iş parçacığı oluşturmanın bir diğer yoludur. Bu sınıf, birden fazla iş parçacığının eş zamanlı olarak çalışmasını kolaylaştırır. Özellikle büyük veriler üzerinde işlem yaparken, işlemci gücünden tam anlamıyla yararlanmak için Parallel sınıfı oldukça kullanışlıdır.

Parallel.ForEach metodu, bir koleksiyon içindeki öğeleri parallel olarak döngüye sokar. Bu sayede döngüdeki işlemler eş zamanlı olarak gerçekleştirilir ve işlem süresi önemli ölçüde azaltılır.

Örnek:
List<int> numbers = new List<int>() { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };Parallel.ForEach(numbers, (num) =>{    Console.WriteLine(num);});

Bu örnekte, numbers koleksiyonundaki her bir öğe parallel olarak işlem görür ve ekrana yazdırılır. Üstelik her bir öğe hangi sırada işlenirse işlensin, sonuç her zaman aynı kalacaktır.

Parallel sınıfının diğer bir kullanımı ise Parallel.Invoke metodudur. Bu metot, belirtilen işlevleri eş zamanlı olarak çalıştırır.

Örnek:
Parallel.Invoke(    () => Islem1(),    () => Islem2(),    () => Islem3());

Bu örnekte, Islem1, Islem2 ve Islem3 adlı üç farklı işlev eş zamanlı olarak çalıştırılır.

Parallel sınıfının kullanımı oldukça kolaydır ve birden fazla iş parçacığının çalışmasını kolaylaştırır. Fakat yine de, işlemci kaynaklarının etkin bir şekilde kullanılması için dikkatli bir şekilde tasarlanması gerekmektedir.


Parallel.ForEach Metodu

Parallel.ForEach metodu, bir koleksiyon içindeki öğeleri paralel olarak döngüye sokar. Bu sayede, büyük veri kümeleri veya işlem yükleri hızlı bir şekilde işlenebilir. İşlem parçaları farklı iş parçacıklarında eş zamanlı olarak çalıştığından, işlem süreleri önemli ölçüde azalır.

Parallel.ForEach metodu, Task sınıfı tarafından sağlanan özellikler ve paralellik avantajları nedeniyle çok yönlü bir yöntemdir. Koleksiyon içindeki her bir öğeyi işlemek için paralel olarak çalışan iş parçacıkları oluşturulur. Bu iş parçacıkları, her bir öğeye aynı anda işlem yapar ve sonucu birleştirir.

Metot İmzası Açıklama
public static ParallelLoopResult ForEach(IEnumerable source, Action body) Koleksiyon içindeki öğeleri paralel olarak döngüye sokar ve belirtilen işlemi gerçekleştirir.

ForEach metodu, iki parametre alır. İlk parametre, işlem yapılacak olan koleksiyondur. İkinci parametre ise, koleksiyon içindeki her bir öğeye uygulanacak olan işlemdir.

Örneğin, aşağıdaki kodda, bir liste içindeki her bir sayının karesi alınarak yeni bir liste oluşturulur:

List sayilar = new List {1, 2, 3, 4, 5, 6};List kareleri = new List();Parallel.ForEach(sayilar, (sayi) => {    kareleri.Add(sayi * sayi);});

Bu kodda, Parallel.ForEach metodu kullanılarak, sayilar listesindeki her bir öğeye paralel olarak işlem uygulanır ve sonuç kareleri listesine eklenir.