C Sharp Monitor Try Enter Kullanımı

  1. tirabzonlu
    6
    90
    7.7.2018 21:39:00

    Monitor Try Enter nedir ve monitor enter dan ne farkı var , bunla ilgili Türkçe kaynak bulamadım arkadaşlar , çalıştığım şirkette benden önceki eleman kullanmış kodlarında , monitor enter ile ilgili bilgi buldum nette ve az çok anladım , ama monitor try enter ı anlamadım

    c# multithreading .net 2 ay önce 168 Görüntüleme
    • swarchitect Monitor.Enter() da ,ilk gelen alır , sonraki gelen , ilk gelenin çıkmasını bekler çıkınca girer , Monitor.TryEnter() da ise ilk gelen alır , ikinci gelen bakar , kilit varsa beklemez , atlar devam eder.

    • Yorum Ekleyin

( 1 ) Cevap

  1. swarchitect
    6
    1180
    8.7.2018 00:00:00

    2 tane thread olduğunu varsayalım;

    Kilitlemek istediğin bloğu Monitor.Enter() ile kilitlemek istiyorsan ,ilk gelen thread bloğa girer , sonraki gelen thread, ilk gelenin çıkmasını bekler , ilk gelenin işi bitince , ikinci gelen o zaman girebilir.

     public class MonitorEnterTest
    {
        private static readonly object MonitorLockObject = new object();
        public static void Test(int a)
        {
            Monitor.Enter(MonitorLockObject);
    
            try
            {
                Console.WriteLine(a+ " Girdim");
            }
            finally
            {
                Monitor.Exit(MonitorLockObject);
            }
        }
    }
    

    Test için;

     class Program
    {
        static void Main(string[] args)
        {
            Task.Run(() =>
            {
                MonitorEnterTest.Test(1);
            });
    
            Task.Run(() =>
            {
                MonitorEnterTest.Test(2);
            });
    
            Console.ReadLine();
        }
    }
    

    Monitor.TryEnter() ile kilitlemek istiyorsan yine ilk gelen bloğa girer , ama ikinci gelen ,eğer blokda kilit varsa birincinin işini bitirmesini beklemez , bloğa girmeden ve beklemeden yoluna devam eder.

     public class MonitorTryEnterTest
    {
        private static readonly object MonitorLockObject = new object();
        public static void Test(int a)
        {
            if (Monitor.TryEnter(MonitorLockObject))
            {
                try
                {
                   Console.WriteLine(a+ " Girdim");
                }
                finally
                {
                    Monitor.Exit(MonitorLockObject);
                }
            }
            else
            {
                Console.WriteLine(a+" yoluma devam ediyorum , beklemiyorum");
            }
    
        }
    }
    

    Test için ;

     class Program
    {
        static void Main(string[] args)
        {
            Task.Run(() =>
            {
                MonitorTryEnterTest.Test(1);
            });
    
            Task.Run(() =>
            {
                MonitorTryEnterTest.Test(2);
            });
    
            Console.ReadLine();
        }
    }
    

Cevabınız