이 문서는 기계 번역을 이용하여 번역되었습니다. 문서를 영문으로 보려면 영문 확인란을 선택하세요. 마우스 포인터를 텍스트 위로 이동시켜 팝업 창에서 영문 텍스트를 표시할 수도 있습니다.
번역
영문

SemaphoreSlim 클래스

.NET Framework (current version)
 

게시 날짜: 2016년 11월

리소스 또는 리소스 풀에 동시에 액세스할 수 있는 스레드 수를 제한하는 Semaphore 대신 사용할 수 있는 간단한 클래스를 나타냅니다.

네임스페이스:   System.Threading
어셈블리:  mscorlib(mscorlib.dll에 있음)

System.Object
  System.Threading.SemaphoreSlim

[ComVisibleAttribute(false)]
[HostProtectionAttribute(SecurityAction.LinkDemand, Synchronization = true, 
	ExternalThreading = true)]
public class SemaphoreSlim : IDisposable

이름설명
System_CAPS_pubmethodSemaphoreSlim(Int32)

동시에 부여할 수 있는 초기 요청 수를 지정하여 SemaphoreSlim 클래스의 새 인스턴스를 초기화합니다.

System_CAPS_pubmethodSemaphoreSlim(Int32, Int32)

동시에 부여할 수 있는 초기 및 최대 요청 수를 지정하여 SemaphoreSlim 클래스의 새 인스턴스를 초기화합니다.

이름설명
System_CAPS_pubpropertyAvailableWaitHandle

세마포에서 대기하는 데 사용할 수 있는 WaitHandle을(를) 반환합니다.

System_CAPS_pubpropertyCurrentCount

SemaphoreSlim 개체에 들어갈 수 있는 남아 있는 스레드의 수를 가져옵니다.

이름설명
System_CAPS_pubmethodDispose()

SemaphoreSlim 클래스의 현재 인스턴스에서 사용하는 모든 리소스를 해제합니다.

System_CAPS_protmethodDispose(Boolean)

SemaphoreSlim에서 사용하는 관리되지 않는 리소스를 해제하고, 관리되는 리소스를 선택적으로 해제할 수 있습니다.

System_CAPS_pubmethodEquals(Object)

지정한 개체가 현재 개체와 같은지 여부를 확인합니다. (Object에서 상속됨)

System_CAPS_protmethodFinalize()

개체가 가비지 수집자에서 회수되기 전에, 해당 개체에서 리소스를 해제하고 다른 정리 작업을 수행할 수 있게 합니다. (Object에서 상속됨)

System_CAPS_pubmethodGetHashCode()

기본 해시 함수로 작동합니다.(Object에서 상속됨)

System_CAPS_pubmethodGetType()

현재 인스턴스의 Type을 가져옵니다.(Object에서 상속됨)

System_CAPS_protmethodMemberwiseClone()

현재 Object의 단순 복사본을 만듭니다.(Object에서 상속됨)

System_CAPS_pubmethodRelease()

SemaphoreSlim 개체를 한 번 해제합니다.

System_CAPS_pubmethodRelease(Int32)

SemaphoreSlim 개체를 지정된 횟수만큼 해제합니다.

System_CAPS_pubmethodToString()

현재 개체를 나타내는 문자열을 반환합니다.(Object에서 상속됨)

System_CAPS_pubmethodWait()

현재 스레드가 SemaphoreSlim에 진입할 수 있을 때까지 스레드를 차단합니다.

System_CAPS_pubmethodWait(CancellationToken)

CancellationToken을(를) 확인하면서 현재 스레드가 SemaphoreSlim에 진입할 수 있을 때까지 스레드를 차단합니다.

System_CAPS_pubmethodWait(Int32)

제한 시간을 지정하는 부호 있는 32비트 정수를 사용하여 현재 스레드가 SemaphoreSlim에 진입할 수 있을 때까지 스레드를 차단합니다.

System_CAPS_pubmethodWait(Int32, CancellationToken)

CancellationToken을(를) 확인하면서 제한 시간을 지정하는 부호 있는 32비트 정수를 사용하여 현재 스레드가 SemaphoreSlim에 진입할 수 있을 때까지 스레드를 차단합니다.

System_CAPS_pubmethodWait(TimeSpan)

TimeSpan(으)로 제한 시간을 지정하여 현재 스레드가 SemaphoreSlim에 진입할 수 있을 때까지 스레드를 차단합니다.

System_CAPS_pubmethodWait(TimeSpan, CancellationToken)

CancellationToken을(를) 확인하면서 제한 시간을 지정하는 TimeSpan을(를) 사용하여 현재 스레드가 SemaphoreSlim에 진입할 수 있을 때까지 스레드를 차단합니다.

System_CAPS_pubmethodWaitAsync()

SemaphoreSlim(으)로 전환될 때까지 비동기적으로 기다립니다.

System_CAPS_pubmethodWaitAsync(CancellationToken)

CancellationToken을(를) 관찰하는 동안 SemaphoreSlim(으)로 전환될 때까지 비동기적으로 기다립니다.

System_CAPS_pubmethodWaitAsync(Int32)

32비트 부호 있는 정수를 사용하여 시간 간격을 측정하여 SemaphoreSlim(으)로 전환될 때까지 비동기적으로 기다립니다.

System_CAPS_pubmethodWaitAsync(Int32, CancellationToken)

CancellationToken을(를) 관찰하는 동안 32비트 부호 있는 정수를 사용하여 시간 간격을 측정하여 SemaphoreSlim(으)로 전환될 때까지 비동기적으로 기다립니다.

System_CAPS_pubmethodWaitAsync(TimeSpan)

TimeSpan을(를) 사용하여 시간 간격을 측정하여 SemaphoreSlim(으)로 전환될 때까지 비동기적으로 기다립니다.

System_CAPS_pubmethodWaitAsync(TimeSpan, CancellationToken)

CancellationToken을 관찰하는 동안 TimeSpan을(를) 사용하여 시간 간격을 측정하여 SemaphoreSlim(으)로 전환될 때까지 비동기적으로 기다립니다.

세마포는 두 가지 유형의: 로컬 세마포 및 명명 된 시스템 세마포에 합니다. 전자는 로컬 응용 프로그램입니다. 후자는 운영 체제 전체에서 볼 이며 프로세스 간 동기화에 적합 합니다. SemaphoreSlim 의 경량 대체 항목인 되는 Semaphore Windows 커널 세마포를 사용 하지 않는 클래스입니다. 와 달리는 Semaphore 클래스는 SemaphoreSlim 클래스는 명명 된 시스템 세마포를 지원 하지 않습니다. 로컬 세마포가으로 사용할 수 있습니다. SemaphoreSlim 클래스는 단일 응용 프로그램 내에서 동기화를 위한 세마포 권장된 합니다.

로컬 응용 프로그램에 있는 리소스의 풀에 대 한 액세스를 제어 하는 간단한 세마포입니다. 세마포를 인스턴스화할 때 동시에 세마포를 입력할 수 있는 스레드의 최대 수를 지정할 수 있습니다. 또한 초기 세마포를 동시에 입력할 수 있는 스레드 수를 지정 합니다. 이것은 세마포의 카운트를 정의합니다.

개수 스레드가 세마포를 이미 획득 될 때마다 감소 시켜 스레드가 세마포를 해제 될 때마다 증가 합니다. 세마포를 입력 하려면 호출 하면 스레드 중 하나는 Wait 또는 WaitAsync 오버 로드 합니다. 세마포를 해제 하려면 호출 중 하나는 Release 오버 로드 합니다. 0 중 하나에 대 한 후속 호출의 수에 도달 하는 경우는 Wait 메서드는 다른 스레드가 세마포를 해제할 때까지 차단 합니다. 보장 된 순서 없이 여러 스레드가 차단 되 면 FIFO, LIFO 등을 제어 하 스레드가 세마포를 입력 하는 경우.

세마포를 사용 하 여 리소스를 보호 하는 코드에 대 한 기본 구조는 같습니다.


' Enter semaphore by calling one of the Wait or WaitAsync methods.
SemaphoreSlim.Wait()
' 
' Execute code protected by the semaphore. 
'
SemaphoreSlim.Release()

모든 스레드가 세마포를 해제 한 경우의 수는 최대 값 지정 된 세마포를 만들 때. 세마포의 카운트는에서 사용할 수는 CurrentCount 속성입니다.

System_CAPS_important중요

SemaphoreSlim 클래스에 대 한 호출에 스레드 또는 작업 id를 적용 하지는 Wait, WaitAsync, 및 Release 메서드. 또한 하는 경우는 SemaphoreSlim(Int32) 생성자를 인스턴스화하는 SemaphoreSlim 개체는 CurrentCount 속성 생성자가 설정한 값 보다 큰 값을 늘릴 수 있습니다. 호출 하는 프로그래머의 몫 확인 하는 Wait 또는 WaitAsync 메서드를 호출 하 여 적절 하 게 쌍을 이루고 Release 메서드.

다음 예제에서는 최대 3 개의 스레드 수 및 초기 카운트가 0 스레드 사용 하 여 세마포를 만듭니다. 이 예제에서는 세마포를 기다리는 동안 차단는 모두 다섯 개의 작업을 시작 합니다. 주 스레드 호출에서 Release(Int32) 오버 로드를 최대값 세마포를 입력 하려면 세 가지 작업을 수 있는 세마포 수를 늘릴 수 있습니다. 세마포가 해제 될 때마다 이전 세마포 수가 표시 됩니다. 콘솔 메시지 세마포 사용을 추적 합니다. 시뮬레이션 된 작업 간격은 각 스레드는 출력을 더 쉽게 읽을 수를 약간 증가 합니다.

using System;
using System.Threading;
using System.Threading.Tasks;

public class Example
{
    private static SemaphoreSlim semaphore;
    // A padding interval to make the output more orderly.
    private static int padding;

    public static void Main()
    {
        // Create the semaphore.
        semaphore = new SemaphoreSlim(0, 3);
        Console.WriteLine("{0} tasks can enter the semaphore.",
                          semaphore.CurrentCount);
        Task[] tasks = new Task[5];

        // Create and start five numbered tasks.
        for(int i = 0; i <= 4; i++)
        {
            tasks[i] = Task.Run( () => {
            // Each task begins by requesting the semaphore.
            Console.WriteLine("Task {0} begins and waits for the semaphore.",
                              Task.CurrentId);
            semaphore.Wait();

            Interlocked.Add(ref padding, 100);

            Console.WriteLine("Task {0} enters the semaphore.", Task.CurrentId);

            // The task just sleeps for 1+ seconds.
            Thread.Sleep(1000 + padding);

            Console.WriteLine("Task {0} releases the semaphore; previous count: {1}.",
                              Task.CurrentId, semaphore.Release()); } );
        }

        // Wait for half a second, to allow all the tasks to start and block.
        Thread.Sleep(500);

        // Restore the semaphore count to its maximum value.
        Console.Write("Main thread calls Release(3) --> ");
        semaphore.Release(3);
        Console.WriteLine("{0} tasks can enter the semaphore.",
                          semaphore.CurrentCount);
        // Main thread waits for the tasks to complete.
        Task.WaitAll(tasks);

        Console.WriteLine("Main thread exits.");
    }
}
// The example displays output like the following:
//       0 tasks can enter the semaphore.
//       Task 1 begins and waits for the semaphore.
//       Task 5 begins and waits for the semaphore.
//       Task 2 begins and waits for the semaphore.
//       Task 4 begins and waits for the semaphore.
//       Task 3 begins and waits for the semaphore.
//       Main thread calls Release(3) --> 3 tasks can enter the semaphore.
//       Task 4 enters the semaphore.
//       Task 1 enters the semaphore.
//       Task 3 enters the semaphore.
//       Task 4 releases the semaphore; previous count: 0.
//       Task 2 enters the semaphore.
//       Task 1 releases the semaphore; previous count: 0.
//       Task 3 releases the semaphore; previous count: 0.
//       Task 5 enters the semaphore.
//       Task 2 releases the semaphore; previous count: 1.
//       Task 5 releases the semaphore; previous count: 2.
//       Main thread exits.

유니버설 Windows 플랫폼
8 이후 사용 가능
.NET Framework
4.0 이후 사용 가능
이식 가능한 클래스 라이브러리
이식 가능한 .NET 플랫폼 에서 지원됨
Windows Phone Silverlight
8.0 이후 사용 가능
Windows Phone
8.1 이후 사용 가능

모든 공용 및 보호 된 구성원 SemaphoreSlim 는 스레드로부터 안전 하 고 제외 여러 스레드에서 동시에 사용할 수 있습니다 Dispose, 사용 되어야 하는 경우에만 다른 모든 작업에는 SemaphoreSlim 완료 했습니다.

맨 위로 이동
표시: