C#’da lock kullanımı örnek olarak thread ile uzun süre çalışan veya işlem yapan bir müşteri listeniz var müşteriyle ilgili yapılan işlemler tam olarak bitmeden silme, düzeltme gibi işlemlere izin vermek istemiyorsanız lock deyimi tam kullanmanız gereken yöntemdir.
C#’da lock deyimi ile işlem kilitleme
C#’da lock kullanımı örnek olarak thread ile uzun süre çalışan veya işlem yapan bir müşteri listeniz var müşteriyle ilgili yapılan işlemler tam olarak bitmeden silme, düzeltme gibi işlemlere izin vermek istemiyorsanız lock deyimi tam kullanmanız gereken yöntemdir.
C#(Program.cs)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 | using System; using System.Collections.Generic; using System.Threading; namespace ConsoleApplication1 { public class Program { public static void Main(string[] args) { //Kullanıcının girdiği sayısal değer kadar döngünün çalışması sağlanıyor. Console.WriteLine("Lütfen Döngü İçin Bir Sayı Giriniz"); var girilenDeger = int.Parse(Console.ReadLine()); //ilgili sınıfımızı oluşturuyoruz. var ornek = new OrnekSinif(girilenDeger); //Thread'i verileri basması için hazırlıyoruz var thread = new Thread(ornek.VerileriBas); //Thread'i başlatıyoruz. thread.Start(); //thread arkada verileri basadursun o sırada bizde yine Silinmesini İstediğimiz //GenericList Index numarası istiyoruz. Console.WriteLine("Silinecek öğenin Index numarasını girin."); ornek.VeriSil(Convert.ToInt32(Console.ReadLine())); Console.ReadLine(); } } internal class OrnekSinif { private readonly object _kilit = new object(); readonly List<string> _genericList = new List<string>(); private readonly int _basilacakDegerSayisi = 0; public OrnekSinif(int baslanilacakDegerSayisi) { _basilacakDegerSayisi = baslanilacakDegerSayisi; } public void VerileriBas() { lock (_kilit) for (var i = 0; i < _basilacakDegerSayisi; i++) { _genericList.Add($"{i}.Değer Yüklendi..."); Thread.Sleep(200); } Console.WriteLine("Döngü Tamamlandı!"); } public void VeriSil(int silinecekVerininIndexNumarasi) { //kullanıcı eğer silinecek numarayı girerse ve eğer //_kilit isimli LOCK işlem için dondurulmuşsa burada beklemeye //alınacaktır. Diğer işlem bitimine kadar Lock içindeki kodlar çalışmayacaktır. lock (_kilit) { Console.WriteLine("VeriSil Metodu Çalıştı."); _genericList.RemoveAt(silinecekVerininIndexNumarasi); } Console.WriteLine($"Liste {_genericList.Count}"); } } } |
Üstteki kodları kısaca özetlemek gerekirse console uygulaması başladığında sizden bir değer girmeniz istenecek ardından thread ile arkaplan girmiş olduğunuz değer kadar genericlist’e ekleme yapılacak bu ekleme sırasında listeden bir işlem silme olayı yapılmasın diyede verisilme esnasında lock deyimi kullanılarak işlemin kilitli olup olmadığı sorgulanmaktadır lock deyiminin kilitlenme aşaması listeye ekleme başlamadan önce yapılmaktadır.