C# Programda İşlem Yaparken Kilitlenme
C# Programda program işlem yaparken kilitlenme sorununu nasıl çözeriz ? C#’a yeni başlayan arkadaşlar bu sorunun çözümünü bilmezler. Nasıl bir sorun olduğunu nasıl arama yapacaklarını da bilemezler.
Bunun için yapmanız gereken çok basit. C# da backgroundworker diye bir sınıfımız var bu bizim için bu işlemi yapıyor.
Şimdi BackgroundWorker kontrolünün özelliklerini inceleyelim:
- WorkerReportsProgress, özelliği “true” yapılırsa, BackgroundWorker çalışırken yapılan işlemlerle ilgili, dışarıya anlık, güncel bilgi gönderir. Bu bilgi BackgroundWorker ‘ın ProgressChanged event ‘inde yakalanır. Default değeri “false” ‘tur.
- WorkerSupportsCancellation, true ise kullanıcı, BackgroundWorker kontrolünün arka planda yaptığı işi sonladırabilir. Default değeri “false” ‘tur. Örneğin programcı olarak ben, arka planda yapılan iş bitmeden, işlemin sonlandırılmasını istemeyebilirim. Bu özelliğin bu opsiyonu sunmasının nedeni de budur.
Bir de bu kontrolümüzün event ‘lerine bir göz atalım. 3 tane event ‘e sahiptir. Bunlar:
- DoWork, event ‘inde BackgroundWorker ‘ın yapılacağı işlemler tanımlanır. BackgroundWorker çalıştırıldığında bu metot çalışmaya başlar. Peki BackgroundWorker ne zaman çalışır? BackgroundWorker ‘ın “RunWorkAsync()” adında bir metodu vardır. “RunWorkAsync” metodu bir defa çağırıldığında “DoWork” event ‘i de tetiklenmiş olur ve iki iş birbirinden bağımsız olarak çalışmaya başlar. “RunWorkAsync” ‘ın, “run work asynchron” kısaltmasıdır. Kelime anlamı da “bağımsız olarak çalış” demektir.
- ProgressChanged, BackgroundWorker ‘ın WorkerReportsProgress özelliği true ise, BackgroundWorker ‘ın yaptığı her işlem değişikliğinde bu event tetiklenir. Bu event ‘te genellikle bir “ProgressBar” kontrolü üzerinde, BackgroundWorker ‘ın işlemlerinin durumu izlenir.
- RunWorkerComplated, BackgroundWorker ‘ın işlemi bittiğinde bu event tetiklenir. Eğer programda ayrı thread ‘deki yapılan işin bittiğinden haberdar olmak isteniyorsa bu event kullanılır. Böylece kullanıcı dostu bir uygulama geliştirmeye olanak sağlar. Bu event, bir kere çalışır.
Örnek olarak açıklayacak olursak::
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; namespace WindowsFormsApplication1 { public partial class Form1 : Form { public int sayi = 0; BackgroundWorker backgroundWorker1 = new BackgroundWorker(); public Form1() { CheckForIllegalCrossThreadCalls = false; InitializeComponent(); } private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) { deneme(); } public void deneme() { while (true) { sayi++; } MessageBox.Show(sayi.ToString()); } private void button1_Click(object sender, EventArgs e) { backgroundWorker1.RunWorkerAsync(); //deneme(); } } }
** Burada button click eventindeki denemeyi yorum satırından çıkarırsanız eski kilitlenen halini de görürsünüz.
Bu kadar…