C# Thread ve Multithread İşlemleri

0
10922

📌 Güncelleme (Ağustos 2026): Thread kavramları hâlâ temel; modern .NET’te Task, async/await ve ThreadPool tercihleriyle ilgili uyarılar eklendi.

Bu yazımızda programlamanın en temel konularından biri olan Thread konusundan bahsedeceğim. İş parçacıkları olarak da bilinir ve projelerde olmazsa olmaz terimler arasındadır.

İş parçacıkları tek başına kullanıldığı gibi çoklu yani multithreading olarak da kullanılır. Genel kullanımı bu şekildedir. Bunun amacı da eş zamanlı olarak -paralel – yapılması istenilen işlemlerde kullanılmaktadır.

Örneğin saati gösteren bir uygulamada aynı zamanda başka bir işlem de yapması gerekebilir. Bu durumda iş parçacıkları kullanılır ve ikisi de birbirinden bağımsız olarak işlemiş olurlar.

2026 notu: Thread sınıfı hâlâ kullanılabilir; ancak yeni .NET uygulamalarında çoğu senaryoda Task, async/await, ThreadPool ve CancellationToken daha güvenli ve yönetilebilir çözümler sunar.

n

Threadlerde Öncelik (Thread Priority)

Eşzamanlı olarak çalışabilen iş parçacıkları olduğunu söylemiştim. Ancak bazı durumlarda öncelik değişebilmektedir. Aynı anda başlatılan iki parçacığın kullanımında birisini önce başlatabiliriz. Thread.Priority özelliği ile bunu yapabiliriz

Highest, AboveNormal, Normal, BelowNormal, Lowest gibi türleri vardır.

thread_1.Priority = ThreadPriority.Normal;

 

Thread.Join İşlemi

Thread işleminde bazı durumların da birbirini beklemesi gerekmektedir. Bu durumlarda join işlemini uyguluyoruz. Böylece bir önceki iş bitmeden diğerine geçiş yapılmamış oluyor. Ayrıca bu metodun belirlenen bir süre kadar işlem yapılması gibi overload özellikleri de bulunur.

İş parçacıkları için bazı genel kullanılan özellikler şunlardır

  • IsAlive : Bu özellik iş parçacıklarının durumunu sorgulamaya yarar. Dönüş olarak bool değer tipi döner. Fakat Thread.ThreadState değerinden farklı olarak true veya false değer döner.
  • ThreadState:  Bu özellik ise durumu çalışıyor, iptal edildi, beklemede gibi daha detaylı özelliklerine ayırmamıza yarar.
  • Suspend:  Eski örneklerde görülebilir; modern .NET’te Thread.Suspend desteklenmez/önerilmez. Bunun yerine CancellationToken, lock/semaphore ve kontrollü bekleme mekanizmaları kullanılmalıdır.

 

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Threading;

namespace ThreadExample
{
    public partial class Form1 : Form
    {
        Thread      thread_1,
                    thread_2,
                    thread_3,
                    thread_4,
                    thread_5;


        System.Windows.Forms.Timer timer = new System.Windows.Forms.Timer ();
        string Thread_State;
        public Form1 ()
        {
            InitializeComponent ();
            thread_1=new Thread (new ThreadStart (t_1));
            thread_2=new Thread (new ThreadStart (t_2));
            thread_3=new Thread (new ThreadStart (t_3));
            thread_4=new Thread (new ThreadStart (t_4));
            thread_5=new Thread (new ThreadStart (t_5));


            Control.CheckForIllegalCrossThreadCalls=false;       // THREAD ÇAKIŞMASINI ENGELLER
            timer.Tick+=new EventHandler (Timer_Tick);
            timer.Interval=(1000); timer.Start ();
            timer.Enabled=true;


        }

        private void button1_Click (object sender, EventArgs e)
        {
            try
            {
                thread_1.Start ();
                //thread_1.Abort () ;  // Thread İptal İşlemi
                Thread_State=thread_1.ThreadState.ToString ();
                Thread_State=thread_1.IsAlive.ToString ();
                thread_1.Join ();
                //thread_1.Join (300);   //300 ms kadar işlem yapar
                Console.WriteLine ("thread_1 bitti");
                label1.Text="thread_1 bitti";
                Thread.Sleep (2000);
                //thread_2.Start ();
                //thread_2.Join ();
                label1.Text="thread_2 bitti";
                Console.WriteLine ("thread_2 bitti");
                thread_3.Start ();
                thread_4.Start ();

            }
            catch (Exception ex)
            {

                MessageBox.Show (ex.Message);
            }


        }



        private void t_1 ()
        {
            thread_5.Start ();

            for (int i = 0; i<=100; i++)
            {
                progressBar1.Value=i;
                Thread.Sleep (20);

            }


        }
        private void t_2 ()
        {
            for (int i = 0; i<=100; i++)
            {
                //  trackBar1.Value=i;
                progressBar2.Value=i;
                Thread.Sleep (20);

            }

        }
        private void t_3 ()
        {
            for (int i = 100; i>=0; i--)
            {
                //  trackBar1.Value=i;
                progressBar3.Value=i;
                Thread.Sleep (20);

            }
        }
        private void t_4 ()
        {

            for (int i = 0; i<=10; i++)
            {
                trackBar1.Value=i;

                Thread.Sleep (200);

            }


        }
        private void t_5 ()
        {

            for (int i = 0; i<=100; i++)
            {
                listBox1.Items.Add (i);

                Thread.Sleep (30);

            }


        }
        private void Timer_Tick (object sender, EventArgs e)
        {
            label2.Text=DateTime.Now.ToString ();
        }


    }
}

 

 

Berkarat.com Form - C# Thread ve Multithread İşlemleri

Bu örnekte konuyla alakalı örnekleri yaptım. Burada uygulama alanları, nasıl kullanıldıkları, paralel işlem yapmaları gibi noktalara vurgu yapıldı.

Örneğin tanımlı iş parçacıklarına paralel olarak arka planda çalışan bir de timer bulunmakta.

” Control.CheckForIllegalCrossThreadCalls=false ” komutu örneği basitleştirmek için kullanılmıştır. Gerçek uygulamalarda UI kontrollerine farklı threadlerden doğrudan erişmek yerine Invoke/BeginInvoke veya async/await desenleri tercih edilmelidir.

 

Programın Linki : https://github.com/berkarat/Threading.git

CEVAP VER

Please enter your comment!
Please enter your name here

Bu site istenmeyenleri azaltmak için Akismet kullanır. Yorum verilerinizin nasıl işlendiğini öğrenin.