2016-12-17 4 views
0

Я только начал учиться SemaphoreSlim, но как семафор.CurrentCount увеличивается и уменьшается в этой программе? С моей точки зрения, когда semaphore.Wait() называется счетчиком выпуска, уменьшается на 1, а когда semaphore.Release(), двум потокам разрешено выполнять, но как увеличивается semaphore.CurrentCount? начинается ли оно с 0 или 1?Как работает semaphore.CurrentCount в этом контексте?

 var semaphore = new SemaphoreSlim(2, 10); 
     for (int i = 0; i < 20; i++) 
     { 
      Task.Factory.StartNew(() => 
      { 
       Console.WriteLine("Entering task " + Task.CurrentId); 
       semaphore.Wait(); //releasecount-- 
       Console.WriteLine("Processing task " + Task.CurrentId); 
      }); 
     } 

     while (semaphore.CurrentCount <= 2) 
     { 
      Console.WriteLine("Semaphore count: " + semaphore.CurrentCount); 
      Console.ReadKey(); 
      semaphore.Release(2); 
     } 
     Console.ReadKey(); 

ответ

1

Семафор подобен комнате с определенной пропускной способностью. С помощью SemaphoreSlim вы указываете начальную емкость и максимум. После того, как он достигнет максимума, никто больше не может войти в комнату. За каждый элемент, который выходит из комнаты, разрешается только одно.

The CurrentCount получает количество оставшихся тем, которые могут войти в комнату.

for (int i = 0; i < 20; i++) 
    { 
     Task.Factory.StartNew(() => 
     { 
      Console.WriteLine("Entering task " + Task.CurrentId); 
      semaphore.Wait(); //only from 2 - 10 threads can be at the time 
      Console.WriteLine("Processing task " + Task.CurrentId); 
     }); 
    } 

А вот

while (semaphore.CurrentCount <= 2) 

если в этот момент число оставшихся потоков меньше 2, то вы освобождаетесь два места на комнату