Threading

Lisans: Creative Commons 11.12.2020 tarihinde güncellendi
Bakabileceğiniz Etiketler: Eğitmen: Geleceği Yazanlar Ekibi

Threading, birden fazla thread’in (iş parçacığı) aynı anda çalışması diye açıklanabilir. Yazdığımız normal bir programlama kodu, tek başına bir thread’dir. Örneğin, büyük bir dosyanın diske yazılmasını sağlamışsak, kullanıcı bu dosyanın diske yazılması bitinceye kadar beklemek zorundadır. Thread kullandığımız taktirde ise, diske yazma işlemini arka planda çalışan bir thread haline getirdiğimizden, kullanıcı beklemek zorunda kalmadan programın başka bölümlerini kullanabilecektir.

Aşağıdaki örnekte, kullanıcı menüden tekrar seçim yapabilmek için dosyanın kaydedilmesini beklemek zorundadır.

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
namespace ConsoleApplication1
{
   class Class1
   {
      static void Main(string[] args)
      {
         while (true == true)
         {
            Console.WriteLine("İşlem seçiniz:");
            Console.WriteLine("1-Dosyayı kaydet, 2-Yazdır");
            string Islem = Console.ReadLine();
            switch (Islem)
            {
               case"1":
                  DosyayiKaydet(); //Bu işlem seçildiğinde kaydetme işlemi bitinceye kadar menü gelmeyecektir.
               break;
               case"2":
                  Yazdir();
               break;
         }
      }
   }
 
   static void DosyayiKaydet()
   {
      for (int Sayac = 0; Sayac <= 1000; Sayac++)
      {
         Console.WriteLine("Dosya kaydediliyor... " + Sayac.ToString());
      }
      Console.WriteLine("Dosya kaydedildi. Enter tuşuna basınız..");
      Console.ReadLine();
   }
 
   static void Yazdir()
   {
      for (int Sayac = 0; Sayac <= 1000; Sayac++)
      {
         Console.WriteLine("Yazdırılıyor... " + Sayac.ToString());
      }
 
      Console.WriteLine("Yazdırıldı. Enter tuşuna basınız..");
      Console.ReadLine();
   }
}

 

Thread kullanıldığında ise, dosyanın kaydedilmesini beklemeden menü tekrar kullanılabilir. Diğer tarafta kaydetme işlemi bittiğinde, ilgili metot kullanıcıyı bilgilendirir.

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {

            while (true == true)
            {
                Console.WriteLine("İşlem seçiniz:");
                Console.WriteLine("1-Dosyayı kaydet, 2-Yazdır");
                string Islem = Console.ReadLine();
                switch (Islem)
                {
                    case "1":
                        Console.WriteLine("Dosya arka planda kaydediliyor... ");
                        Thread DosyayiKaydet_Thread = new Thread(new ThreadStart(DosyayiKaydet)); // Bu satırda iş parçacığı henüz çalışmaya başlamamıştır. Sadece çalıştırılacağında hangi metodu çağıracağı belirtilmiştir. DosyayiKaydet_Thread isimli thread, DosyayiKaydet metodunu çağıracaktır.
                        DosyayiKaydet_Thread.Start(); //DosyayiKaydet metodunu çağırarak iş parçacağının paralel çalışmasını sağlar.
                        // Dosyanın kaydedilmesinin bitirilmesi beklenmeden aşağıdaki kod parçacığının çalışmasına devam edilerek menü hemen gelecektir.
                        break;
                    case "2":
                        Yazdir();
                        break;
                }

            }
        }

        static void DosyayiKaydet()
        {
            Thread.Sleep(10000); // 10 saniye bekle. Bu metot milisaniye cinsinden bekleme süresi almaktadır. Bekleme esnasında diğer thread'ler çalışabilmektedir.
            Console.WriteLine("Dosya kaydedildi.");
        }

        static void Yazdir()
        {
            for (int Sayac = 0; Sayac <= 1000; Sayac++)
            {
                Console.WriteLine("Yazdırılıyor... " + Sayac.ToString());
            }

            Console.WriteLine("Yazdırıldı. Enter tuşuna basınız..");
            Console.ReadLine();
        }

    }
}

 

En çok kullanılan bazı thread özellik (property) ve metotları aşağıda verilmiştir:

IsAlive

Thread’in çalışma durumunu verir.

Name

Thread’in adını atar veya verir.

Priority

Thread’in çalışma önceliğini atar veya verir.

Abort

ThreadAbortExcetion hatasını atarak thread’in çalışmasını iptal eder.

Resume

Beklemeye geçirilmiş thread’in çalışmasının devam etmesini sağlar.

Sleep

Belirtilen süre kadar beklemeye geçer.

Suspend

Thread’i geçici süre durdurur.