Merhaba arkadaşlar bu makalemizde Lock yapısından bahsedeceğiz.
Lock nedir? Nerelerde kullanılır? sorularına açıklık getirerek
başlayalım.
Lock yapısını, çamaşır makinelerine benzeterek
örnekleyecek olursak iki senaryo yaratabiliriz.
Senaryo 1:
Eski bir çamaşır makineniz var ve bu nedenle makinenizde hiçbir kontrol
mekanizması yok. Çamaşırları çamaşır makinenize attınız ve çamaşırlarınız yıkanıyor. Daha
sonra ev arkadaşınız bilinçsiz bir şekilde makinenin kapağını
açıyor ve makinada yıkanan çamaşırlarla beraber deterjanlı su yerlere dökülüyor ancak; makine
hala çalışmaya
devam ediyor. Bu durumda hiç hoşnut olmayacağınız bir şekilde evinizi su basıyor ve çamaşırlarınız kirleniyor.
Senaryo 2:
Artık yeni nesil bir çamaşır makinesi aldınız. Çamaşırları çamaşır
makinenize attınız ve yıkamayı başlattınız. Ev arkadaşınız
tekrar makinanın kapağını açmaya çalışıyor ama açılmıyor çünkü; makinenin sürdürmekte olduğu bir
işlem
var ve bu işlem
bitene kadar makine kapağı kilitli tutularak, kapağın işlem
devam ederken açılması durumunda oluşabilecek aksaklıkların önüne
geçiliyor. İşte
biz buna ölümcül kilitleme adını veriyoruz.
Kilit sayesinde yürütmüş olduğumuz
işlemi
dış
etkenlere karşı koruyarak işlemin sorunsuz devam etmesini sağlayabiliyoruz. Artık kilit
yapısını teknik alanda da uygulayabiliriz.
Bir ListBox'a onbinlerce değer
ekleneceğini
düşünelim.
Böyle bir değer
ekleme işlemi
tabi ki uzun bir süre alacaktır. Bu işlem devam ederken aynı anda
ListBox'a eklenmiş değerlerden birini silmeye çalışmamız, yazılımımızda sorun
yaratacak olabilir. Bu nedenle işlem devam ederken üzerinde hiçbir değişiklik
yapılmaması için işlemi Kilit yapısı altında çalıştırıyoruz.
Şimdi hem Lock yapısı
kullanılarak hem de kullanılmayarak yapılan örneklere göz atalım.
Form
görüntümüz bu şekilde.
Düz mantık uygulama
public
partial class DuzMantik : Form
{
public DuzMantik()
{
InitializeComponent();
//Thread Guvenligi Saglaniyor.
Control.CheckForIllegalCrossThreadCalls = false;
}
Thread t;
ThreadStart ts;
void ListBoxDoldur()
{
for (int i = 0;
i < 5000; i++)
{
listBox1.Items.Add(i);
listBox1.Refresh();
}
}
private void
button1_Click(object sender, EventArgs e)
{
//Formun Kitlenmemesi adina ListBoxDoldur Methodunu
Thread'lerle cagirdim
ts = new ThreadStart(ListBoxDoldur);
t = new Thread(ts);
t.Start();
}
private void
button3_Click(object sender, EventArgs e)
{
listBox1.Items.RemoveAt(listBox1.SelectedIndex);
MessageBox.Show("Ne
Yaptin işlem devam ederken işlem içerisinden kayit
sildin?\n simdi yandin sen:)\nKorkma Suc senin degil suc silmene izin veren
yazilimcida:)");
}
private void
button2_Click(object sender, EventArgs e)
{
t.Suspend()
}
}
Bu uygulamada Button1 ile ListBox'a Thread aracılığıyla
değer
ekleme işlemi
gerçekleştiriliyor.
İşlem
devam ederken Button3 ile ListBox içerisindeki verileri silebiliyorum. Bu tıpkı
çamaşır
makinemiz çalışırken kapağını açmamız gibi bize ileride sorun yaratacak olabilir. Bu
nedenle kontrol edilmesi gereken bir davranış. Bunun için şimdi
Lock yapısının kullanıldığı örneği inceleyelim.
LOCK ile kullanımı
public
partial class LockUygulanmis : Form
{
public LockUygulanmis()
{
InitializeComponent();
Control.CheckForIllegalCrossThreadCalls = false;
}
Thread t;
ThreadStart ts;
private object
KaleKilit = new object();
void ListBoxDoldur()
{
lock (KaleKilit)
{
for (int i = 0;
i < 5000; i++)
{
listBox1.Items.Add(i);
listBox1.Refresh();
}
}
}
void Sil()
{
MessageBox.Show("Kayit
Silmek istiyorsan Islemin Bitmesini Beklemelisin...");
lock (KaleKilit)
{
listBox1.Items.RemoveAt(listBox1.SelectedIndex);
MessageBox.Show("Silmek
istedigin Kayit silinmistir.(İşlem Bitti Cunku))");
}
}
private void
button1_Click(object sender, EventArgs e)
{
ts = new ThreadStart(ListBoxDoldur);
t = new Thread(ts);
t.Start();
}
private void
button2_Click(object sender, EventArgs e)
{
t.Suspend();
}
private void
button3_Click(object sender, EventArgs e)
{
ts = new ThreadStart(Sil);
t = new Thread(ts);
t.Start();
}
}
İşlem
yapılmaya başladığı
zaman KaleKilit objesine işlemin başladığına dair bilgi veriliyor. Sonrasında bu işlemi
etkileyecek herhangi bir işlem yapılmak istendiğinde Lock yapısının
kullanıldığı
KaleKilit objesi kontrol ediliyor ve eğer işlem
yapı tarafından kilitliyse, işleme yapılmak istenen müdahele engelleniyor.
Lock yapısı bu kadar basit ve zevkli :) . Uygulamanın kaynak
kodlarını aşağıdaki
linkten indirebilirsiniz.
sinan.baran@bilgeadam.com
www.sinanbaran.com
OlumculKilit(Lock).rar
(46,92 kb)