다음을 통해 공유


ConcurrencyMode 재진입

재진입 샘플은 서비스 구현에서 ConcurrencyMode.Reentrant를 사용할 때의 필요성과 의미를 보여 줍니다. ConcurrencyMode.Reentrant는 서비스(또는 콜백)가 지정된 시간에 메시지 하나만 처리한다는 것을 ConcurencyMode.Single의미합니다(유사). 스레드 안전을 보장하기 위해, Windows Communication Foundation (WCF)는 메시지 처리를 잠가 다른 메시지가 처리되지 않도록 합니다. 재진입 모드 InstanceContext 의 경우 서비스가 발신 전화를 걸기 직전에 잠금이 해제되어 후속 호출(샘플에서 설명한 대로 다시 인입할 수 있음)이 다음에 서비스에 들어올 때 잠금을 가져올 수 있습니다. 이 동작을 보여주기 위해 이 샘플은 클라이언트와 서비스가 이중 계약을 사용하여 서로 메시지를 보내는 방법을 보여 줍니다.

정의된 계약은 서비스에 의해 구현되는 메서드와 Ping 클라이언트에서 구현되는 콜백 메서드 Pong 를 사용하는 이중 계약입니다. 클라이언트는 틱 수를 사용하여 서버의 Ping 메서드를 호출하여 호출을 시작합니다. 서비스는 틱 수가 0과 같지 않은지 확인한 다음 틱 수를 줄이면서 콜백 Pong 메서드를 호출합니다. 이 작업은 샘플의 다음 코드에 의해 수행됩니다.

public void Ping(int ticks)
{
     Console.WriteLine("Ping: Ticks = " + ticks);
     //Keep pinging back and forth till Ticks reaches 0.
     if (ticks != 0)
     {
         OperationContext.Current.GetCallbackChannel<IPingPongCallback>().Pong((ticks - 1));
     }
}

콜백의 Pong 구현은 Ping 구현과 동일한 논리를 사용합니다. 즉, 틱 수가 0이 아닌지 확인한 다음 콜백 채널에서 메서드를 호출 Ping 하고(이 경우 원래 Ping 메시지를 보내는 데 사용된 채널) 틱 수가 1씩 감소합니다. 틱 수가 0에 도달하는 순간 메서드는 모든 회신을 호출을 시작한 클라이언트가 수행한 첫 번째 호출로 다시 래핑 해제하여 반환합니다. 콜백 구현에 표시됩니다.

public void Pong(int ticks)
{
    Console.WriteLine("Pong: Ticks = " + ticks);
    if (ticks != 0)
    {
        //Retrieve the Callback  Channel (in this case the Channel which was used to send the
        //original message) and make an outgoing call until ticks reaches 0.
        IPingPong channel = OperationContext.Current.GetCallbackChannel<IPingPong>();
        channel.Ping((ticks - 1));
    }
}

PingPong 메서드는 요청/응답 방식으로 작동합니다. 즉, Ping이 반환하기 전까지 CallbackChannel<T>.Pong()에 대한 첫 번째 호출이 반환되지 않습니다. 클라이언트에서 Pong 메서드는 자신이 실행한 다음 Ping 호출이 반환될 때까지 반환할 수 없습니다. 콜백과 서비스는 모두 나가는 요청/회신 호출을 수행해야 보류 중인 요청에 대해 회신할 수 있으므로 두 구현 모두 ConcurrencyMode.Reentrant 동작으로 표시되어야 합니다.

샘플을 설정, 빌드 및 실행하려면

  1. Windows Communication Foundation 샘플 에 대한One-Time 설정 절차를 수행했는지 확인합니다.

  2. 솔루션의 C# 또는 Visual Basic .NET 버전을 빌드하려면 Windows Communication Foundation 샘플빌드의 지침을 따릅니다.

  3. 단일 또는 컴퓨터 간 구성에서 샘플을 실행하려면 Windows Communication Foundation 샘플실행의 지침을 따릅니다.

입증합니다

샘플을 실행하려면 클라이언트 및 서버 프로젝트를 빌드합니다. 그런 다음 두 개의 명령 창을 열고 디렉터리를 <sample>\CS\Service\bin\debug 및 <sample>\CS\Client\bin\debug 디렉터리로 변경합니다. 그런 다음 입력하여 service.exe 서비스를 시작한 다음 입력 인수로 전달된 틱의 초기 값을 사용하여 Client.exe 호출합니다. 10틱에 대한 샘플 출력이 표시됩니다.

Prompt>Service.exe
ServiceHost Started. Press Enter to terminate service.
Ping: Ticks = 10
Ping: Ticks = 8
Ping: Ticks = 6
Ping: Ticks = 4
Ping: Ticks = 2
Ping: Ticks = 0

Prompt>Client.exe 10
Pong: Ticks = 9
Pong: Ticks = 7
Pong: Ticks = 5
Pong: Ticks = 3
Pong: Ticks = 1